22

AndroidのMediaPlayerに問題があります。重要な機能、主にMediaPlayerの現在のステータスを取得する方法、または準備ができているかどうかを確認する方法が不足しているようです。準備されたリスナーがあることは知っていますが、MediaPlayerはアクティビティよりも長持ちするため、再生アクティビティが再開されたときに、メディアをロードしようとしているかどうか、メディアがロードされているかどうかなど、現在のプレーヤーの状態を取得すると便利です。 。何かが足りないのですか、それともプレーヤーの状態を自分で追跡する必要がありますか?

便利な他の機能はonPlayStateChanged()です-私は現在、手動で再生状態を追跡する必要があります。私はそれを間違っていますか?

4

6 に答える 6

18

答えが遅すぎないことを願っています。MediaPlayerクラスにはisPrepared() メソッドや getStatus() メソッドなどがないため、自分でその状態を追跡する必要があります。ただし、それほど難しいことではありません。

MediaPlayer クラスには、本当に役立つ優れた状態図があります。その図に基づいてサービスを実装する必要があります。また、MediaPlayer オブジェクトを常に同じスレッドから制御すると、その状態を追跡しやすいので、そうすることをお勧めします。prepareAsync() メソッドは、注意が必要な唯一の非同期メソッドですが、プレーヤーが準備中であることを示すブール値を保持できます。これは、prepareAsync() 呼び出しから onPrepared() が完了するまで「true」になります。呼ばれた。とにかく、いつでも onError を実装し、IllegalStateException をキャッチして、不正な状態から誤ってメソッドを呼び出した場合のクラッシュを回避できます。

それにもかかわらず、メディア再生ガイドは私を大いに助けてくれました.

于 2013-10-11T08:41:56.097 に答える
0

これを回避するには、定義済みのブール変数を用意し、onPrepared() コールバックが呼び出されたときに true に設定し、MediaPlayer の開始時に false に設定します。例えば:

public boolean mpPrepared = false;

mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mpPrepared = true;
    }
});

mp.start();
mpPrepared = false;
于 2021-02-23T12:01:36.470 に答える
0

MediaPlayer クラス自体でそれを行う方法はないと思います。

最も簡単なのは、作成およびリセット時に true に設定されるグローバル変数です。リリース時に false に設定されます。

boolean playerAvailable = true;

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

playerAvailable = true;

....

mediaPlayer.reset();   // ready to play again

playerAvailable = true;

....

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

playerAvailable = false;
于 2019-11-07T13:03:14.503 に答える