2015-11-13 53 views
1

我是新來的Android和建立一個聊天室應用程序與語音郵件類似於WhatApp或Messenger。到目前爲止,我可以創建並上傳語音筆記到我的服務器,並在設備上播放。但是,我正在考慮如何處理回放,因此一次只能播放一個語音音符。通過在ListAdapter中初始化媒體播放器,然後在媒體播放器正在播放時調用mp.stop(),我一次只能獲得一條消息進行播放。但是,每次我選擇播放另一個語音註釋時,我的計時器和搜索欄都會被更新。列表視圖中的Android媒體播放器

我在想,也許我錯誤地處理了這個問題。下面的代碼駐留在我的視圖類中。

// Runnable 
private Runnable onEverySecond = new Runnable() { 
    @Override 
    public void run() { 
     if (!isPaused){ 
      if (mediaPlayer.isPlaying()) { 
       // Update seekbar position 
       position = mediaPlayer.getCurrentPosition(); 
       // Displaying time completed playing 
       playTime.setText(AppUtils.milliSecondsToTimer(mediaPlayer.getCurrentPosition())); 
       seekBar.setProgress(position); 
       // Running this thread after 100 milliseconds 
       seekBar.postDelayed(onEverySecond, 100); 
      }else{ 
       if(listener != null) listener.onAudioStoppedListener(true); 
      } 
     } 
    } 
}; 

// Play button 
actionButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d(TAG, "Play button clicked!"); 
      if (isPaused) { 
       if (mediaPlayer.isPlaying()){ 
        mediaPlayer.stop(); 
       } 
       setMediaPlayer(); 
       setIsPlaying(); 
       mediaPlayer.seekTo(position); 
       mediaPlayer.start(); 
       updateProgressBar(); 
      } else { 
       mediaPlayer.pause(); 
       setPaused(); 
      } 
     } 
    }); 


private void setMediaPlayer() { 
    try { 
     String fileName = getFileName(); 
     File filePath = new File(MyApp.getVoiceNoteDir() + fileName); 
     if (filePath.exists()){ 
      mediaPlayer.reset(); 
      mediaPlayer.setDataSource(filePath.getPath()); 
      mediaPlayer.prepare(); 

      seekBar.setMax(mediaPlayer.getDuration()); 
      seekBar.setProgress(0); 
      playTime.setText(AppUtils.milliSecondsToTimer(mediaPlayer.getDuration())); 
      actionButton.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_pause_light)); 
      mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
       @Override 
       public void onCompletion(MediaPlayer mp) { 
        mp.stop(); 
        seekBar.setProgress(0); 
        actionButton.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_play_light)); 
        setPaused(); 
       } 
      }); 
     }else{ 
      checkFile(); 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 


void setPaused(){ 
    isPaused = true; 
    actionButton.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_play_light)); 
} 

void setIsPlaying(){ 
    if (mediaPlayer.isPlaying()) mediaPlayer.stop(); 
    isPaused = false; 
    actionButton.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_pause_light)); 
} 

回答

1

創建一個服務來處理MediaPlayer操作。不要在適配器或列表中做媒體內容。

通過爲媒體操作創建單獨的服務,您將擁有單個MediaPlayer實例。如果您要求它播放特定文件,您也可以處理停止/重置以前的播放文件。

我可以找到一個tutorial link爲你通過服務做到這一點。