5

我想检查 MediaPlayer 是否已发布 - 如何检查?我发现 isPlaying 生成异常而不是 false - 如何以简单的方式执行它很复杂。

    mediaPlayer = new MediaPlayer();
    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            mediaPlayer.release();
        }
    });
4

1 回答 1

8

我认为没有办法通过 MediaPlayer 类本身来做到这一点。

true最简单的做法是在创建和重置时设置为全局变量。它设置为false发布。

boolean mIsPlayerRelease = true;

mediaPlayer = MediaPlayer.create(myContext, soundId); // ready to play
mIsPlayerRelease = false;

....
mediaPlayer.reset();   // ready to play again
mIsPlayerRelease = false;

....

mediaPlayer.release(); // can't be played until release.
mIsPlayerRelease = true;

编辑:

您可以通过将创建放在 an 中AsyncTask并在完成时设置变量来解决阻塞问题。

private class MediaCreator extends AsyncTask<Integer, Void, Boolean> {

   WeakReference<Context> mCtx;

   public MediaCreator(Context ctx) {
      mCtx = new WeakReference(ctx);
   }

   @Override
   protected Boolean doInBackgroind(Integer.... params) {
      final Context ctx = mCtx.get();
      if(ctx == null || params == null || params.length == 0) {
         return false;
      }

      mediaPlayer = MediaPlayer.create(ctx, params[0];
   }

   @Override
   protected void onPostExecute(Boolean success) {
      if(success) {
          mIsPlayerRelease = false;
      } else {
          mIsPlayerRelease = true;
      }
   }
}

您可以将此类放在正在处理的任何类中mediaPlayer。开始它

MediaCreator creator = new MediaCreator(myContext);
creator.execute(R.id.mySoundId);

该方法doInBackground将在单独的线程上创建和缓冲媒体播放器。它将在创建后返回,onPostExecute()并将在主线程上调用,false如果创建了播放器,则将布尔值设置为。

于 2013-02-05T15:06:12.353 回答