0

由于某种原因,我的媒体播放器在暂停时完成。现在我看到另一篇文章说它是异步的和 300 毫秒的差异,我理解。但我的主要问题是我的视频还剩 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) 没有这个错误。

4

1 回答 1

0

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

于 2012-06-05T20:35:21.730 回答