android - Mediaplayer setOnCompletionListener 重复调用

标签 android listener media-player android-seekbar

在我的应用程序中,我在 ListView 中显示我的音频文件,当单击列表项时,必须使用搜索栏在 ListView 单元格内播放特定文件。但现在我想在播放结束时更新用户界面。 我用过 onCompletionListener,但它在播放开始时重复调用。 这是我的代码

private void startPlayBack(final MessagesAdapter.ViewHolder viewHolder){

        try {

            if(mMediaPlayer!=null){
                if(mMediaPlayer.isPlaying()) {
                    mMediaPlayer.stop();
                }
            }
            mMediaPlayer.reset();
            mMediaPlayer.setDataSource(viewHolder.mChatMessage.mMessages);
            mMediaPlayer.prepareAsync();

        } catch (IOException e) {
            Log.i("audioplay", "IOException *************",e);
        }catch (IllegalStateException e) {
            Log.i("audioplay", "IllegalStateException *************",e);
        }

        mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {

                viewHolder.mAudioPlayBtn.setVisibility(View.VISIBLE);
                viewHolder.mAudioPlayBtn.setImageDrawable(mContext.getResources().getDrawable(R.drawable.audio_close));
                mMediaPlayer.setLooping(false);
                mMediaPlayer.start();
            }
        });

        mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                Log.i("Completion Listener", "audio Completed");
            }
        });

        viewHolder.mAudioSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (mMediaPlayer != null && fromUser) {
                    mMediaPlayer.seekTo(progress * 1000);
                    mMediaPlayer.start();
                }
            }
        });

        seekUpdation(viewHolder);
    }

这是得到的日志信息,

08-20 07:28:24.099  14873-14873/com.cybosol.sabanet I/Completion Listener﹕ audio Completed
08-20 07:28:24.099  14873-14873/com.cybosol.sabanet I/Completion Listener﹕ audio Completed
08-20 07:28:24.099  14873-14873/com.cybosol.sabanet I/Completion Listener﹕ audio Completed
08-20 07:28:24.103  14873-14873/com.cybosol.sabanet I/Completion Listener﹕ audio Completed
08-20 07:28:24.107  14873-14873/com.cybosol.sabanet I/Completion Listener﹕ audio Completed
08-20 07:28:24.107  14873-14873/com.cybosol.sabanet I/Completion Listener﹕ audio Completed
08-20 07:28:25.739  14873-14873/com.cybosol.sabanet I/Completion Listener﹕ audio Completed
08-20 07:28:26.415  14873-14873/com.cybosol.sabanet I/Completion Listener﹕ audio Completed
08-20 07:28:26.415  14873-14873/com.cybosol.sabanet I/Completion Listener﹕ audio Completed
08-20 07:28:26.419  14873-14873/com.cybosol.sabanet I/Completion Listener﹕ audio Completed
08-20 07:28:26.419  14873-14873/com.cybosol.sabanet I/Completion Listener﹕ audio Completed
08-20 07:28:27.323  14873-14873/com.cybosol.sabanet I/Completion Listener﹕ audio Completed
08-20 07:28:27.959  14873-14873/com.cybosol.sabanet I/Completion Listener﹕ audio Completed

最佳答案

ViewPager 中使用 MediaPlayers 时,我遇到了类似的问题。结果是 MediaPlayers 遇到错误,导致调用 OnCompletionListener。来自OnErrorListener documentation :

Returns

True if the method handled the error, false if it didn't. Returning false, or not having an OnErrorListener at all, will cause the OnCompletionListener to be called.

为您的 MediaPlayers 实现一个 OnErrorListener 以防止对 OnCompletionListener 的无关调用。

关于android - Mediaplayer setOnCompletionListener 重复调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32112261/

相关文章:

javascript - 更新: How to find event listeners on a DOM node in prototype?

android - 如何监听 ListView 行中的复选框?

Java - 将 JFrame 传输到 JPanel

Android 媒体播放器服务最佳实践

iphone - 播放YouTube链接无效

android - 如何去除 Material Button 中图标的色调?

jQuery:我使用什么监听器来检查浏览器自动填充密码输入字段?

java - Intellij IDEA Ultimate android 布局预览无法等待构建完成

java - Android Activity 中的霜玻璃背景效果

android - 从 firebase 数据库中获取多个值