2017-10-24 3 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

この 'this.setIsRecyclable(false);'をMessageViewHolderコンストラクタに追加して、 –

答えて

3

を見つけることができます:

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

は、あなたがあるプライマリアクションを実装する必要があり一部を行うには

pause()の呼び出しが戻ると、MediaPla yerオブジェクトは一時停止状態になります。開始状態から一時停止状態への遷移、またはその逆の遷移は、プレーヤエンジンにおいて非同期的に起こることに留意されたい。 isPlaying()の呼び出しで状態が更新されるまでには時間がかかる場合があり、ストリーミングされたコンテンツの場合は秒数になることがあります。

これはここに該当する場合があります。サウンドが停止していない理由と、isPlaying()がtrueを返す理由は異なる場合があります。たとえば、MediaPlayerの複数のインスタンスが並行して存在する可能性があり、mPlayerの静的にそのようなオプションが除外されます。

1

必要に応じてシステムのオーディオステータスを確認できます。あなたのケースでは、再生ボタンがクリックされるたびに、以下の条件を最初にチェックする必要があります。

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

あなたはdocumentationから全体のドキュメントにhere

関連する問題