【问题标题】:Exception with playing Audio File播放音频文件的异常
【发布时间】:2012-01-18 00:43:54
【问题描述】:

我有一个包含本地资源(音频文件)的所有资源 ID 的数组。我正在尝试一一播放所有这些文件。为此,我正在媒体播放器的 setOnCompletionListener 事件上播放下一个文件,如下所示:-

mMediaPlayer.setOnCompletionListener();

连续播放文件的完整代码如下:-

代码

private void playing(){
  MediaPlayer mMediaPlayer = new MediaPlayer();
  mMediaPlayer = MediaPlayer.create(this, Constants.mAudioIds[play]);  // next file will be played
  mMediaPlayer.start();
  mMediaPlayer.setOnCompletionListener(new OnCompletionListener(){
      @Override
     public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
        play +=1;
        playing();
     }

    });
}

如果我单独播放所有文件,它们会完美播放。但是使用上面的代码,我在 MediaPlayer 中遇到错误。下面是堆栈跟踪。

堆栈跟踪

01-17 20:52:10.088: INFO/MediaPlayer(379): Info (1,44)
01-17 20:52:10.358: DEBUG/dalvikvm(215): GC freed 43 objects / 2096 bytes in 108ms
01-17 20:52:15.368: WARN/MediaPlayer(379): info/warning (1, 26)
01-17 20:52:15.410: ERROR/PlayerDriver(31): Command PLAYER_PREPARE completed with an error or info PVMFErrResource
01-17 20:52:15.419: ERROR/MediaPlayer(379): error (1, -17)
01-17 20:52:15.462: WARN/PlayerDriver(31): PVMFInfoErrorHandlingComplete
01-17 20:52:15.568: DEBUG/MediaPlayer(379): create failed:
01-17 20:52:15.568: DEBUG/MediaPlayer(379): java.io.IOException: Prepare failed.: status=0x1
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at android.media.MediaPlayer.prepare(Native Method)
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at android.media.MediaPlayer.create(MediaPlayer.java:644)
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at com.media.sample.ui.AutoPlay.playing(AutoPlay.java:162)
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at com.media.sample.ui.AutoPlay.access$0(AutoPlay.java:138)
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at com.media.sample.ui.AutoPlay$1.onCompletion(AutoPlay.java:171)
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1157)
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at android.os.Looper.loop(Looper.java:123)
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at android.app.ActivityThread.main(ActivityThread.java:4363)
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at java.lang.reflect.Method.invokeNative(Native Method)
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at java.lang.reflect.Method.invoke(Method.java:521)
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
01-17 20:52:15.568: DEBUG/MediaPlayer(379):     at dalvik.system.NativeStart.main(Native Method)

此外,相同的代码在极少数设备上完美运行(但在大多数设备+模拟器中)它给出了上述异常。

请提供一些解决方案。

【问题讨论】:

标签: android media-player


【解决方案1】:

您需要查阅状态图和图表,其中概述了媒体播放器可以处于的状态以及在哪种状态下可以调用哪些方法。 http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States

因此,媒体播放器可能有点棘手。

【讨论】:

    【解决方案2】:

    您需要像这样调用 prepareAsync()

    private void playing(){
      MediaPlayer mMediaPlayer = new MediaPlayer();
      mMediaPlayer = MediaPlayer.create(this, Constants.mAudioIds[play]);  
      mMediaPlayer.prepareAsync();
    
      mMediaPlayer.setOnCompletionListener(new OnCompletionListener(){
          @Override
         public void onCompletion(MediaPlayer mp) {
                    // TODO Auto-generated method stub
            play +=1;
            playing();
         }
    
        });
    }
    
     @Override
     public void onPrepared(MediaPlayer mp) {
      Log.d(TAG, "Stream is prepared");
      mp.start();
     }
    

    Complete example is here.

    【讨论】:

      猜你喜欢
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多