2017-10-24 49 views
5

Obecnie pracuję nad aplikacją Chat. W tym jest funkcja wysyłania notatek głosowych. Wysyłanie i odtwarzanie notatek głosowych działa dobrze. Ale problem polega na tym, że kiedy gram w notatkach głosowych, poprzedni głos zauważa, że ​​gra się nie kończy. Oba grają razem.mediaplayer.isPlaying zawsze jest fałszywy

tutaj jest mój kod dla grających notatek głosowych,

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; 
    } 
} 

tu mPlayer.isPlaying zawsze dostaje fałszywe.

Proszę mi pomóc!

+0

możesz dodać to 'this.setIsRecyclable (false);' w konstruktorze MessageViewHolder i spróbuj –

Odpowiedz

3

Z documentation:

Kiedy wywołanie pause() wraca, MediaPla Twój obiekt przechodzi w stan Wstrzymany. Zwróć uwagę, że przejście ze stanu Uruchomiony do stanu Wstrzymany i odwrotnie odbywa się asynchronicznie w silniku odtwarzacza. Może minąć trochę czasu, zanim stan zostanie zaktualizowany w wywołaniach funkcji isPlaying() i może to być liczba sekund w przypadku treści przesyłanych strumieniowo.

Tak może być w tym przypadku. Przyczyny, dla których dźwięk nie jest zatrzymywany i dlaczego funkcja Odtwarzanie() zwraca wartość true, może być inna. Na przykład wiele instancji MediaPlayer może istnieć równolegle, dzięki czemu statystyka mPlayer wyklucza taką opcję.

1

Możesz sprawdzić status audio systemu, gdy zajdzie taka potrzeba. W twoim przypadku, po kliknięciu przycisku odtwarzania, najpierw należy sprawdzić poniższy warunek.

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

W zrobić część należy wdrożyć podstawowej czynności, która jest:

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

można znaleźć całą dostępną dokumentacją here