MediaPlayer onCompletionListener在暂停时调用

时间:2012-06-05 13:47:09

标签: android media-player

我的媒体播放器由于某种原因在暂停时完成。现在我已经看到另一篇文章,说它是异步和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);
    }
}

编辑:这只发生在我测试的其中一部手机的Nexus S(2.3.3)上。另一个Galaxy S(Froyo)没有这个错误。

1 个答案:

答案 0 :(得分:0)

我弄清楚我做错了什么。正在调用OnCompletionListener。问题是我正在运行2个媒体播放器并且在我两次调用initPlayer时意外地将它们设置为onCompletionlistener。一旦进入surfaceCreated,再次进入onResume()。无论是Galaxy S搞砸了还是它有奇怪的错误检查,因为这个问题没有出现在那里。