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;

編集:

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 に答える