意外行为:立即完成媒体播放器

时间:2013-06-05 17:43:32

标签: java android media-player

我正在尝试将音频恢复到原来的位置以及用户离开片段时的文件。为此,我使用个人首选项保存音频文件的位置和搜索位置,并在用户离开时保存音频是否正在播放的布尔值。我在onPause()中首先保存了这个信息。

当我恢复时,我初始化视图等,我在onResume中做的最后一件事是从个人首选项中读取并播放存储在那里的音频是合适的。

但是当我尝试从onResume播放时,会立即调用媒体完成侦听器并跳过该文件。

我一直在运行测试,我知道媒体播放器提供了正确的数据,准备正确并设置为播放。

我尝试播放音频的方式与我手动点击播放音频的方式相同,而且运行完美无缺。

只有在尝试将音频“恢复”到用户离开时的位置时,才会立即调用完成侦听器。

有没有人见过这个?

    public void setAudioURLAndPLay(Context context, String url)
    {
        Log.d(TAG, "setAudioURLAndPLay");
        CacheQueue.getInstance().addImmediateTaskToQueue(CacheQueue.AUDIO_TASK, context, url, 0, handler);

    }

    private void playCahcedFile(String location)
    {
        Log.d(TAG, "playCahcedFile");
        try
        {
            this.reset();
            this.setAudioStreamType(AudioManager.STREAM_MUSIC);
            this.setDataSource(location);
            this.setOnPreparedListener(new OnPreparedListener()
            {

                @Override
                public void onPrepared(MediaPlayer mp)
                {
                    setPlay();
                }
            });
            this.prepareAsync();
        }
        catch (Exception e)
        {
            Log.d(TAG, "Exception", e);
        }
    }

    public void setPlay()
    {
        Log.d(TAG, "setPlay");
        this.start();
        this.setProgressHandler(this.listener);
    }

以及正在进行通话的地方

    public void initializeFromResume()
    {
        PersonalPrefs prefs = new PersonalPrefs(getActivity());
        if (!prefs.isPLaying())
        {
            return;
        }
        else
        {
            playNewAudio(prefs.getURL());
            // ((ActivityMain) getActivity()).getMediaManager().setSeek(prefs.getSeek());
        }
    }

private void playNewAudio(String url)
{
        getMediaManager().setAudioURLAndPLay(getActivity(), url)
    mediaState = MediaState.playing;
    initializeSeekBar();
    getMediaManager().setOnCompletionListener(this);
    mediaController.togglePlayButton(mediaState);

}

1 个答案:

答案 0 :(得分:0)

我明白了,并且会将答案发布给将来遇到类似麻烦的人。 只需要延迟发布一个帖子。不完全令人惊讶,但它确实有效。

        h.postDelayed(new Runnable()
        {

            @Override
            public void run()
            {
                PersonalPrefs prefs = new PersonalPrefs(getActivity());
                playNewAudio(prefs.getURL());
            }
        }, 1000);