I am currently working on a chat application. This has the function of sending voice notes. Sending and playing voice notes works great. But the problem is that when I play voice notes, the previous voice notes do not stop. Both are playing together.
here is my code for playing voice notes,
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; } }
here mPlayer.isPlaying always gets false.
Please help me!
source share