Android 如何正确更改MediaPlayer音频流类型?

Android 如何正确更改MediaPlayer音频流类型?,android,media-player,toggle,playback,Android,Media Player,Toggle,Playback,我有一个简单的mp服务来播放、暂停、恢复音频。一切正常。 但是,昨晚我决定为用户添加一项功能,将音频路由到耳机或扬声器,并一直在与mp.setAudioStreamType()进行斗争 问题是,在连接服务并创建mp时,我无法更改它。我不想终止服务和/或取消绑定和重新绑定,因为这需要大量重构 播放音频时如何更改AudioStreamType 这是我的密码: 玩家服务: public class PService extends Service { private MediaPlayer mp =

我有一个简单的mp服务来播放、暂停、恢复音频。一切正常。 但是,昨晚我决定为用户添加一项功能,将音频路由到耳机或扬声器,并一直在与
mp.setAudioStreamType()
进行斗争

问题是,在连接服务并创建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);
            }
        });
单击“切换路线”按钮

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

清单中需要
修改音频设置权限
,此操作才能正常运行

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
}