2013-05-09 81 views
1

我有一個簡單的mp服務來播放,暫停,恢復音頻。一切正常。 但是,昨晚我決定爲用戶添加一個功能,將音頻路由至耳機或揚聲器,並已與mp.setAudioStreamType()對戰。如何正確更改MediaPlayer音頻流類型?

問題是,我無法在服務連接和mp創建時更改它。我不想終止服務和/或解除綁定和重新綁定,因爲它需要大量的重構 如何在播放音頻時更改AudioStreamType?

這裏是我的代碼:

播放器服務:

public class PService extends Service { 

private MediaPlayer mp = new MediaPlayer(); 
public static final String PLAYING_FINISHED_MSG = "1"; 
@Override 
public void onCreate() { 
    super.onCreate(); 
} 

@Override 
public void onDestroy() { 
    mp.stop(); 
    mp.release(); 
} 

private void playSong(String file) { 
    try { 
     mp.reset(); 
     mp.setDataSource(file); 
     mp.setAudioStreamType(MYAPP.getAudioStreamType()); 
     mp.prepare(); 
     mp.start(); 

     mp.setOnCompletionListener(new OnCompletionListener() { 
      public void onCompletion(MediaPlayer arg0) { 
       Intent i = new Intent(); 
       i.setAction(MDService.PLAYING_FINISHED_MSG); 
       sendBroadcast(i); 
      } 
     }); 

切換路線按鈕的onclick

currentlyPlayingFile = file; 
currentlyPlayingPhone = phone; 

lastDurationBeforePause = mpInterface.getCurrentPosition(); 

if(MYAPP.getAudioStreamType() == AudioManager.STREAM_MUSIC) 
{ 
    MYAPP.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 
     recording_player_route_button.setImageResource(R.drawable.route_off);      
    } 
    else{ 
    MYAPP.setAudioStreamType(AudioManager.STREAM_MUSIC);        
     recording_player_route_button.setImageResource(R.drawable.route_on); 
     }   



    try {  

     mpInterface.playFile(file); 
     player_seekbar.setProgress(0); 
     player_seekbar.setMax(mpInterface.getDuration()); 
     //seekto last millisecond after switching from/to sepaker 
     if(seekTo>0) 
     { 
      mpInterface.seekTo(seekTo); 
     } 
     isPauseButtonPressed = false; 
     handleSeekBarUpdate.postDelayed(handleSeekBarUpdateJob, 1); 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } 

回答

0

需要的MODIFY_AUDIO_SETTINGS permission在艙單這個工作。

AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE); 
am.setMode(AudioManager.MODE_NORMAL); 
MediaPlayer mp=new MediaPlayer(); 
Uri ringtoneUri=RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
try 
{ 
    mp.setDataSource(getApplicationContext(), ringtoneUri); 
    mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); 
    mp.prepare(); 
    mp.start(); 
} 
catch(Exception e) 
{ 
    //exception caught in the end zone 
}