0

何らかの理由でメディアプレーヤーが一時停止中に完了しました。今、私はそれが非同期で300msの違いであり、私が理解していることについて述べた別の投稿を見ました。しかし、私の主な問題は、ビデオの残り時間が20秒で、一時停止中に20秒がなくなった後に終了することです。これが私が台無しにしたかもしれない関連するコードです:

    private void initPlayer()
{
    try {
        if(videoFile != null)
        {

            afd = getAssets().openFd(videoFile);

            instructionVideoPlayer = new MediaPlayer();

            instructionVideoPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());

            instructionVideoPlayer.setDisplay(holder);

            instructionVideoPlayer.prepare();
            Log.i("Instruction Video", "videoPrepared");
            instructionVideoPlayer.setOnCompletionListener(instructionVideoComplete);
            instructionVideoPlayer.setOnPreparedListener(this);
        }

    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        Log.i(this.toString(), "IOEXception");
        e.printStackTrace();
        //initPlayer();
    } catch (Exception e)
    {
        Log.i("InitPlayer", e.getClass().toString());
        e.printStackTrace();
    }

    restoreOverlayState();
}

リスナー:

    MediaPlayer.OnCompletionListener instructionVideoComplete = new MediaPlayer.OnCompletionListener() {

    public void onCompletion(MediaPlayer arg0) {
        Log.i("onCompletion", "called");
        if(!videoFile.contentEquals(LangSelect.INSTRUCTION_05))
        {
            Intent returnIntent = new Intent();
            returnIntent.putExtra(LangSelect.ACTION, LangSelect.GO_VIDEO_NEXT);
            setResult(RESULT_OK, returnIntent);
            continuePlaying = true;
            toFinish();

        }
        else
            toFinish();
    }
};

public void onPrepared(MediaPlayer mediaPlayer) 
{
    playVideo();
}

再生および一時停止機能

    private void playVideo()
{
    instructionVideoPlayer.seekTo(pausedAt);
    instructionVideoPlayer.start();
    restoreOverlayState();
}
private void pauseVideo()
{
    pausedAt = instructionVideoPlayer.getCurrentPosition();
    instructionVideoPlayer.pause();
}

private void restoreOverlayState()
{
    prefs = getSharedPreferences(SAVE_PREFS, Context.MODE_PRIVATE);

    if(prefs.getBoolean(IS_PAUSED, false))
    {
        pauseOverlay.setVisibility(View.VISIBLE);
        pauseVideo();
    }
    else
    {
        pauseOverlay.setVisibility(View.GONE);
    }
}

編集:これは、私がテストしている電話の1つであるNexus S(2.3.3)でのみ発生します。他のGalaxyS(Froyo)にはこのエラーはありません。

4

1 に答える 1

0

私は自分が間違っていたことを理解しました。OnCompletionListener が呼び出されていました。問題は、2 つのメディア プレーヤーを実行していて、initPlayer を 2 回呼び出していたため、誤って同じ onCompletionlistener をそれらに設定していたことです。surfaceCreated で 1 回、onResume() の最後でもう一度。Galaxy Sが台無しになっているか、この問題が表示されなかったために奇妙なエラーチェックが行われています.

于 2012-06-05T20:35:21.730 に答える