2012-04-15 178 views
0

在我正在編寫的應用程序中,用戶可以從數據庫中選擇條目並播放該條目的內容:條目由多個聲音文件組成沒有限制)。在我的應用程序中,我將條目(已存儲在我的數據庫中)的聲音文件的URI位置返回到列表中。代碼如下:Android:立即停止播放聲音文件

public void audioPlayer() { 
    // set up MediaPlayer 
    MediaPlayer mp = new MediaPlayer(); 
    DatabaseHandler db = new DatabaseHandler(this); 
    Entry retrieveEntry = new Entry(); 

    retrieveEntry = db.getEntry(); 

    List<String> path = retrieveEntry.getAudioUri(); 

    path.size(); 

    System.out.println("PATH SIZE: " +path.size()); 

    System.out.println("FILEZ: " + path); 

    Iterator<String> i = path.iterator(); 
    String myAudio; 
    int count = 0; 

    while (i.hasNext()) { 
     System.out.println(count); 
      myAudio = i.next(); 
      System.out.println("MY AUDIO: " + myAudio); 

      MediaPlayer player = MediaPlayer.create(this, Uri.parse(myAudio)); 
      player.start(); 
      player.stop(); 
      player = MediaPlayer.create(this, Uri.parse(myAudio)); 
      player.start(); 

      count++; 
     } 
} 

我的用戶要求有用戶輸入的播放文件 - 是那裏玩的第一個文件,然後等待用戶按下按鈕,然後播放第二個辦法文件,然後等待用戶按下按鈕等?此時,按下播放按鈕時,所有已返回的聲音文件將同時播放,而不是一個接一個地播放。

在此先感謝您提供的任何幫助!

回答

2

您可以使用此類播放播放列表。這將開始一個音頻,當音頻結束時,它將開始播放下一個音頻,直到列表結束。如果你想在循環,即達到結束後開始第一音頻播放的播放列表,然後通過isLooping = true在startPlayingPlaylist(list,looping)

AudioPlayer player = new AudioPlayer(); 
    player.startPlayingPlaylist(list, false); 

public class AudioPlayer{ 
    MediaPlayer player = null; 
    ArrayList<String> playlist = null; 
    int position = 0; 

    public AudioPlayer() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 
    public void startPlayingPlaylist(ArrayList<String> list, boolean looping){ 
     playlist = list; 
     if(player!=null){ 
      player.release(); 
     } 
     if(playlist!=null && playlist.size()>0){ 
      player = MediaPlayer.create(LMApplicaton.getInstance(),Uri.parse(playlist.get(position))); 
      player.setWakeMode(LMApplicaton.getInstance(), PowerManager.PARTIAL_WAKE_LOCK); 
      player.setLooping(looping); 
      player.start(); 
      // Set onCompletion listener 
      player.setOnCompletionListener(new OnCompletionListener() { 

       @Override 
       public void onCompletion(MediaPlayer mp) { 
        position = position+1; 
        if(position<playlist.size()){ 
         try { 
          player.reset(); 
          player.setDataSource(playlist.get(position)); 
          player.prepareAsync(); 
         } catch (IllegalArgumentException e) { 
          e.printStackTrace(); 
         } catch (IllegalStateException e) { 
          e.printStackTrace(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 

        } else if(player.isLooping()==true){ 
         position = position%playlist.size(); 
         try { 
          player.reset(); 
          player.setDataSource(playlist.get(position)); 
          player.prepareAsync(); 
         } catch (IllegalArgumentException e) { 
          e.printStackTrace(); 
         } catch (IllegalStateException e) { 
          e.printStackTrace(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
        else if(player.isLooping()==false){ 
         player.release(); 
         player = null; 
        } 
       } 
      }); 
      player.setOnPreparedListener(new OnPreparedListener() { 

       @Override 
       public void onPrepared(MediaPlayer mp) { 
        player.start(); 
       } 
      }); 
     } 
    } 
    public void pause(){ 
     if(player!=null && player.isPlaying()){ 
      player.pause(); 
     } 
    } 
    public void play(){ 
     if(player!=null && player.isPlaying()==false){ 
      player.start(); 
     } 
    } 
    public boolean isPlaying(){ 
     return player.isPlaying(); 
    } 
    public void release(){ 
     if(player!=null){ 
      player.release(); 
     } 
    } 

} 

編輯: 類下面接收清單的音頻,然後播放第一個音頻。當用戶撥打startNextAudio()時,它播放下一個音頻您可以根據您的要求使用其中任何一種

public class AudioPlayer MediaPlayer player = null; ArrayList playlist = null; int position = 0;

public AudioPlayer() { 
    super(); 
    // TODO Auto-generated constructor stub 
} 
public void startPlayingPlaylist(ArrayList<String> list){ 
    playlist = list; 
    if(player!=null){ 
     player.release(); 
    } 
    if(playlist!=null && playlist.size()>0){ 
     player = MediaPlayer.create(LMApplicaton.getInstance(),Uri.parse(playlist.get(position))); 
     player.setWakeMode(LMApplicaton.getInstance(), PowerManager.PARTIAL_WAKE_LOCK); 
     player.start(); 
     // Set onCompletion listener 
     player.setOnPreparedListener(new OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer mp) { 
       player.start(); 
      } 
     }); 
    } 
} 
public void startNextAudio(){ 
    position = position+1; 
    if(position<playlist.size()){ 
     try { 
      player.reset(); 
      player.setDataSource(playlist.get(position)); 
      player.prepareAsync(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } else if(player.isLooping()==true){ 
     position = position%playlist.size(); 
     try { 
      player.reset(); 
      player.setDataSource(playlist.get(position)); 
      player.prepareAsync(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    }else{ 
     Log.i("AudioPlayer","Playlist reached at the end"); 
    } 
} 
public void pause(){ 
    if(player!=null && player.isPlaying()){ 
     player.pause(); 
    } 
} 
public void play(){ 
    if(player!=null && player.isPlaying()==false){ 
     player.start(); 
    } 
} 
public boolean isPlaying(){ 
    return player.isPlaying(); 
} 
public void release(){ 
    if(player!=null){ 
     player.release(); 
    } 
} 

}

+0

與第一類完美配合 – Innocent 2017-08-07 12:41:25

1

一個辦法是實施MediaPlayer.OnCompletionListener接口。這給了你,你可以使用像這樣的MediaPlayer.onCompletion()回調方法:

@Override 
public void onCompletion(MediaPlayer mp) { 
    if (i.hasNext) { 
    // ...hand mp the next file 
    // ...show the user the 'play next' button 
    } 
} 

注意,你還需要調用MediaPlayer.setOnCompletionListener()方法在您的設置。