Android播放在线音频问题,报错MediaPlayer error

女爷i 2023-05-30 14:57 56阅读 0赞

#播放在线音频问题 报错MediaPlayer error

这里对Android播放在线音频报错的情况做一下简单经验总结。

如果报错:MediaPlayer error (1, -2147483648)

有两种可能:
1、这个网址是不正确的
2、这个音频文件的编码格式,手机不支持
3、还有可能电脑端浏览器能访问,但是都是手机端访问返回403,这个我就遇到了。
上面的情况,一般播放在线音频文件的预加载模式时间会比较久,有时候20多秒.才显示播放失败!
第一种情况和第三种情况其实都是差不多,都是访问没有返回200的访问码。

如果报错:E/MediaPlayerNative: error (1, -19)

就是Media状态不对的情况下播放
比如:
1、MediaPlayerNative 没有回收
需要在播放完成或者停止的时候把对象释放。
mediaPlayer.reset();
mediaPlayer.release();

2、设置错误的播放流类型
比如设置成播放闹铃类型,这个可能要特殊权限或者其他设置,反正会报错。
MediaPlayer.setAudioStreamType(AudioAttributes.USAGE_NOTIFICATION_RINGTONE);
这个熟悉一般不设置或者设置成MUSIC类型就可以啦。

在线音频播放前最好,判断一下是否能接收数据,然后再播放。

如下判断连接的url地址返回的状态的代码:

  1. /**
  2. * 判断连接的url地址返回的状态,必须在子线程运行否则报错null
  3. *
  4. * @param address
  5. * @return
  6. */
  7. public int getUrlConnectionState(String address) {
  8. int status = HttpURLConnection.HTTP_NOT_FOUND;
  9. try {
  10. URL urlObj = new URL(address);
  11. HttpURLConnection oc = (HttpURLConnection) urlObj.openConnection();
  12. oc.setUseCaches(false);
  13. oc.setConnectTimeout(3000); // 设置超时时间
  14. oc.connect();
  15. status = oc.getResponseCode();// 请求状态
  16. if (HttpURLConnection.HTTP_OK == status) {
  17. return status;
  18. }
  19. } catch (Exception e) {
  20. Log.e(TAG, " Media getUrlConnectionState error=" + e.getMessage());
  21. }
  22. return status;
  23. }

如果返回的值为HttpURLConnection.HTTP_OK(200),说明能正常连通。

完整的控制在线音频文件的示例代码:

  1. private staticTimer timer = new Timer();
  2. private static MediaPlayer mOnlineMediaPlayer; //背景音频文件对象
  3. private IActionListener mOnlineMediaListener = null;
  4. /**
  5. * 播放在线音频文件
  6. *
  7. * @param url
  8. * @param loop
  9. * @param iActionListener
  10. */
  11. public void playOnlineMedia(final String url, final float volume, final boolean loop, final IActionListener iActionListener) {
  12. TimerTask timerTask = new TimerTask() {
  13. @Override
  14. public void run() {
  15. playInnerOnlineMedia(url, volume, loop, iActionListener);
  16. }
  17. };
  18. timer.schedule(timerTask, 0);
  19. }
  20. public void playInnerOnlineMedia(final String url, float volume, boolean loop, IActionListener iActionListener) {
  21. Log.i(TAG, "playOnlineMedia url=" + url + ",volume=" + volume + ",loop=" + loop + ",iActionListener=" + iActionListener);
  22. int state = getUrlConnectionState(url);
  23. if (state != HttpURLConnection.HTTP_OK) {
  24. Log.e(TAG, "playOnlineMedia visit url=" + url + " ,return state:" + state);
  25. return;
  26. }
  27. stopOnlineMedia();
  28. mOnlineMediaListener = iActionListener;
  29. mOnlineMediaPlayer = new MediaPlayer();
  30. try {
  31. //音频播放完毕,回调onCompletion方法
  32. mOnlineMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  33. @Override
  34. public void onCompletion(MediaPlayer mp) {
  35. Log.i(TAG, "playOnlineMedia onCompletion url=" + url);
  36. if (mOnlineMediaListener != null) {
  37. onActionListener(true, mOnlineMediaListener);
  38. }
  39. mOnlineMediaListener = null;
  40. }
  41. });
  42. mOnlineMediaPlayer.setDataSource(url);
  43. mOnlineMediaPlayer.setLooping(loop);
  44. mOnlineMediaPlayer.setVolume(volume, volume);
  45. mOnlineMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
  46. @Override
  47. public boolean onError(MediaPlayer mp, int what, int extra) {
  48. Log.e(TAG, "playOnlineMedia setOnErrorListener what=" + what + ",extra=" + extra);
  49. return false;
  50. }
  51. });
  52. mOnlineMediaPlayer.setAudioStreamType(AudioAttributes.USAGE_NOTIFICATION_RINGTONE);
  53. mOnlineMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  54. @Override
  55. public void onPrepared(MediaPlayer mp) {
  56. Log.i(TAG, "playOnlineMedia onPrepared url=" + url);
  57. if (mOnlineMediaPlayer != null) {
  58. mp.start();
  59. }
  60. }
  61. });
  62. mOnlineMediaPlayer.prepareAsync();
  63. onActionListener(false, iActionListener);
  64. } catch (IOException e) {
  65. Log.e(TAG, "playOnlineMedia.start error=" + e.getMessage());
  66. e.printStackTrace();
  67. }
  68. }
  69. /**
  70. * 停止在线音频文件播放
  71. */
  72. public void stopOnlineMedia() {
  73. Log.e(TAG, "stopOnlineMedia ");
  74. if (mOnlineMediaPlayer != null) {
  75. try {
  76. if (mOnlineMediaPlayer.isPlaying()) {
  77. mOnlineMediaPlayer.stop();
  78. }
  79. mOnlineMediaPlayer.release();
  80. } catch (IllegalStateException e) {
  81. Log.e(TAG, "stopOnlineMedia error=" + e.getMessage());
  82. }
  83. if (mOnlineMediaListener != null) {
  84. onActionListener(true, mOnlineMediaListener);
  85. }
  86. mOnlineMediaPlayer = null;
  87. mOnlineMediaListener = null;
  88. }
  89. }
  90. /**
  91. * 暂停在线音频文件播放
  92. */
  93. public void pauseOnlineMedia() {
  94. Log.e(TAG, "pauseOnlineMedia ");
  95. if (mOnlineMediaPlayer != null) {
  96. try {
  97. if (mOnlineMediaPlayer.isPlaying()) {
  98. mOnlineMediaPlayer.pause();
  99. }
  100. } catch (IllegalStateException e) {
  101. Log.e(TAG, "pauseOnlineMedia error=" + e.getMessage());
  102. }
  103. }
  104. }
  105. /**
  106. * 恢复在线音频文件播放
  107. */
  108. public void resumeOnlineMedia() {
  109. Log.e(TAG, "resumeOnlineMedia ");
  110. if (mOnlineMediaPlayer != null) {
  111. try {
  112. if (!mOnlineMediaPlayer.isPlaying()) {
  113. mOnlineMediaPlayer.start();
  114. }
  115. } catch (IllegalStateException e) {
  116. Log.e(TAG, "resumeOnlineMedia error=" + e.getMessage());
  117. }
  118. }
  119. }
  120. /**
  121. * 判断音频文件是否在播放
  122. *
  123. * @return
  124. */
  125. public boolean isOnlineMediaPlaying() {
  126. try {
  127. if (mOnlineMediaPlayer != null && mOnlineMediaPlayer.isPlaying()) {
  128. return true;
  129. }
  130. } catch (IllegalStateException e) {
  131. Log.e(TAG, "isOnlineMediaPlaying error=" + e.getMessage());
  132. }
  133. return false;
  134. }
  135. /**
  136. * 判断连接的url地址返回的状态,必须在子线程运行否则报错null
  137. *
  138. * @param address
  139. * @return
  140. */
  141. public int getUrlConnectionState(String address) {
  142. int status = HttpURLConnection.HTTP_NOT_FOUND;
  143. try {
  144. URL urlObj = new URL(address);
  145. HttpURLConnection oc = (HttpURLConnection) urlObj.openConnection();
  146. oc.setUseCaches(false);
  147. oc.setConnectTimeout(3000); // 设置超时时间
  148. oc.connect();
  149. status = oc.getResponseCode();// 请求状态
  150. if (HttpURLConnection.HTTP_OK == status) {
  151. return status;
  152. }
  153. } catch (Exception e) {
  154. Log.e(TAG, " Media getUrlConnectionState error=" + e.getMessage());
  155. }
  156. return status;
  157. }

播放状态接口IActionListener

  1. interface IActionListener {
  2. /**
  3. * 行为开始
  4. */
  5. void onStart();
  6. /**
  7. *行为结束
  8. */
  9. void onEnd();
  10. }

#改变才能更加强大!

发表评论

表情:
评论列表 (有 0 条评论,56人围观)

还没有评论,来说两句吧...

相关阅读