我目前正在从事聊天应用程序。此功能具有发送语音便笺的功能。语音笔记的发送和播放正常。但是问题是,当我播放语音笔记时,先前的语音笔记播放没有停止..两者同时播放。

这是我的语音提示代码,

 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:



在这里可能就是这种情况。声音没有停止并且isPlaying()返回true的原因可能有所不同。例如,MediaPlayer的多个实例可能并行存在,使mPlayer静态将排除该选项。

关于java - mediaplayer.isPlaying始终为假,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46907866/

10-10 04:56