2017-10-24 65 views
5

현재 채팅 응용 프로그램을 작성 중입니다. 여기에는 음성 메모를 보내는 기능이 있습니다. 음성 메모를 보내고 재생하는 것이 좋습니다. 그러나 문제는 내가 음성 메모를 재생할 때 이전 음성 메모가 멈추지 않고 ... 둘 다 함께 놀고 있다는 것입니다.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는 항상 false 도착, 재생 음성 메모 내 코드입니다.

도와주세요! 이 필요할 때마다

+0

는 u는이'this.setIsRecyclable (false)를 추가 할 수 있습니다 –

답변

3

을 찾을 수 있습니다 : 에서

AudioManager manager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); 
if(manager.isMusicActive()) 
{ 
    // to do 
} 

당신이 기본 액션을 구현해야 부분을 수행하는

pause() 호출이 반환되면 MediaPla yer 객체가 Paused 상태가됩니다. Started 상태에서 Paused 상태로 또는 그 반대로 전환하는 것은 플레이어 엔진에서 비동기 적으로 발생합니다. isPlaying()에 대한 호출에서 상태가 업데이트되기까지는 약간의 시간이 걸릴 수 있으며 스트리밍 된 내용의 경우에는 초 단위 일 수 있습니다.

여기 경우가 있습니다. 사운드가 멈추지 않는 이유와 isPlaying()이 true를 반환하는 이유가 다를 수 있습니다. 예를 들어 MediaPlayer의 여러 인스턴스가 병렬로 존재할 수 있으므로 mPlayer static은 그러한 옵션을 제외시킵니다. MessageViewHolder 생성자에`시도,

1

당신은 시스템 오디오 상태를 확인할 수 있습니다. 귀하의 경우, 재생 버튼을 클릭 할 때마다 아래 조건을 먼저 확인해야합니다.

KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PAUSE); 
audioManager.dispatchMediaKeyEvent(event); 

당신은 documentation에서 전체 문서를 here