java – mediaplayer.isPlaying总是变错

我目前正在处理聊天应用程序.在此,有发送语音笔记的功能.语音笔记的发送和播放工作正常.但问题是,当我播放语音音符时,之前的语音音符不会停止播放……两者都在一起播放.

这是我播放语音笔记的代码,

 public static class MessageViewHolder extends RecyclerView.ViewHolder {

    private TextView messageTextView;
    private ImageView messageImageView;
    private TextView timeTextView;
    private LinearLayout textMessageLayout;
    private TextView messengerNameTextView;
    private CircleImageView messengerPhotoImageView;
    ImageView leftQuackImage,rightQuackImage;
    private LinearLayout voiceNotesLayout;
    private ImageView playImageView,stopImageView;
    private SeekBar progressSeekbar;

    private MediaPlayer mPlayer;
    double timeElapsed = 0,finalTime = 0;
    Handler durationHandler = new Handler();
    Runnable updateSeekBarTime;
    boolean isPlaying;

    public MessageViewHolder(View itemView) {
        super(itemView);
        messageTextView = (TextView) itemView.findViewById(R.id.messageTextView);
        messageImageView = (ImageView) itemView.findViewById(R.id.messageImageView);
        timeTextView = (TextView) itemView.findViewById(R.id.timeTextView);
        textMessageLayout = (LinearLayout) itemView.findViewById(R.id.textMessageLayout);
        messengerNameTextView = (TextView) itemView.findViewById(R.id.messengerTextView);
        messengerPhotoImageView = (CircleImageView) itemView.findViewById(R.id.messengerImageView);
        leftQuackImage = (ImageView) itemView.findViewById(R.id.leftQuackImage);
        rightQuackImage = (ImageView) itemView.findViewById(R.id.rightQuackImage);
        voiceNotesLayout = (LinearLayout) itemView.findViewById(R.id.voiceNotesLayout);
        playImageView = (ImageView) itemView.findViewById(R.id.playImageView);
        stopImageView = (ImageView) itemView.findViewById(R.id.stopImageView);
        progressSeekbar = (SeekBar) itemView.findViewById(R.id.progressSeekbar);
        isPlaying = false;
        mPlayer = new MediaPlayer();
    }
    public  void setupAudioPlay(final long duration,final String url){
        progressSeekbar.setMax((int) duration);
        progressSeekbar.setClickable(false);
        mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        try {
            mPlayer.setDataSource(url);
            mPlayer.prepareAsync();
        } catch (IOException e) {
            e.printstacktrace();
        }catch (IllegalStateException e){
            e.printstacktrace();
        }

        playImageView.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.e("Media player","isPlaying"+mPlayer.isPlaying()+isPlaying);
                if (mPlayer.isPlaying()) {
                    mPlayer.stop();
                    mPlayer.release();
                    mPlayer = null;
                }
                if (!isPlaying) {
                    isPlaying = true;
                    mPlayer.start();
                    playImageView.setVisibility(View.GONE);
                    stopImageView.setVisibility(View.VISIBLE);
                    timeElapsed = mPlayer.getCurrentPosition();
                    progressSeekbar.setProgress((int) timeElapsed);
                    durationHandler.postDelayed(updateSeekBarTime,100);

                } else {
                    isPlaying = false;
                    mPlayer.pause();
                }
            }
        });

        stopImageView.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (isPlaying) {
                    if (stopPlaying()) {
                        playImageView.setVisibility(View.VISIBLE);
                        stopImageView.setVisibility(View.GONE);
                    }
                }
            }
        });

        mPlayer.setonCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                if (mp != null) {
                    mPlayer.seekTo(0);
                    isPlaying = false;
                    progressSeekbar.setProgress(0);
                }
                playImageView.setVisibility(View.VISIBLE);
                stopImageView.setVisibility(View.GONE);
            }
        });

        updateSeekBarTime = new Runnable() {
            public void run() {
                if (mPlayer != null) {
                    if (mPlayer.isPlaying()) {
                        timeElapsed = mPlayer.getCurrentPosition();
                        progressSeekbar.setProgress((int) timeElapsed);
                        durationHandler.postDelayed(this,100);
                    } else {
                        mPlayer.pause();
                        isPlaying = false;
                        progressSeekbar.setProgress(0);
                        playImageView.setVisibility(View.VISIBLE);
                        stopImageView.setVisibility(View.GONE);
                    }
                }
            }
        };
    }

    private boolean stopPlaying() {
        mPlayer.pause();
        mPlayer.seekTo(0);
        if (!mPlayer.isPlaying()) {
            return true;
        }
        return false;
    }
}

这里mPlayer.isPlaying总是变错.

请帮我!

最佳答案
documentation

When the call to pause() returns,the MediaPlayer object enters the Paused state. Note that the transition from the Started state to the Paused state and vice versa happens asynchronously in the player engine. It may take some time before the state is updated in calls to isPlaying(),and it can be a number of seconds in the case of streamed content.

这可能就是这种情况.声音未停止的原因以及为什么isPlaying()返回true可能会有所不同.例如,MediaPlayer的多个实例可能并行存在,使得mPlayer static会排除这样的选项.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...