web-dev-qa-db-ja.com

Android:mediaplayerは未処理のイベントを廃止しました

アプリから再生する必要がある一連の音声アナウンスメントのオーディオファイルの長さを取得する必要があります。オーディオファイルをリソースとして追加しましたが、うまく再生されます。以下のサンプルコードは、実際には意図した目的に最適です。オーディオファイルの継続時間を返します。

コードは次のとおりです。

float getDurationOfAudioResource(LocationEnum loc, Context context){
    float  duration = 0;
    try {
        MediaPlayer mp; 
        mp = MediaPlayer.create(context, getAudioResource(loc));
        duration = mp.getDuration();
        mp.release();
        mp = null;
    }
    catch (IllegalStateException e) {e.printStackTrace(); logError(25, "TestDescItem:Fault::Could not open mediaplayer object with audio resource.");} 
    return duration;
}

ここに奇妙なことがあります。このコードは、特定のテスト用の音声命令セットを準備するメインアクティビティで呼び出されます。このアクティビティ内にエラーはありません。しかし、2番目のアクティビティが呼び出されるとすぐに、logcatで長いエラー文字列が表示されます。

03-07 13:23:43.820: I/ActionLogger(21435): GenTest_Info_Test #0 successfully created.
03-07 13:23:43.830: I/ActionLogger(21435): GenTest_Info_Test #1 successfully created.
03-07 13:23:43.840: I/ActionLogger(21435): GenTest_Info_Test #2 successfully created.
03-07 13:23:43.850: I/ActionLogger(21435): GenTest_Info_Test #3 successfully created.
<snip>
03-07 13:23:43.910: I/ActionLogger(21435): GenTest_Info_all tests successfully created.
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events
03-07 13:23:47.270: W/MediaPlayer(21435): mediaplayer went away with unhandled events
<snip>

メインアクティビティ(エラーなし)の最後まで、および2番目のアクティビティの最初の行からシングルステップしました。エラーは間違いなくアクティビティ間にスローされます。
また、tryブロックの8行をコメントアウトすると(ゼロが返されるだけ)、logcatエラーが回避されます。 8行を復元すると、エラーが戻ってきます。ドキュメントを掘り下げてWebを検索しましたが、mediaplayerオブジェクトを正しく構築、リリース、および破棄しているため、エラーが発生する理由がわかりません。とはいえ、私は何か間違ったことをしているに違いありません。何か案は?

おかげで、

ケビン

55
Hephaestus

mp.reset();の前にmp.release();を置くだけです。

182
Andrew

聖なるファイブ:

    if(mp!=null) {
        if(mp.isPlaying())
            mp.stop();
        mp.reset();
        mp.release();
        mp=null;
    }
42
Li3ro