1

オーディオを再生、一時停止、再開するための単純な 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);
            }
        });

ルート切り替えボタン 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();
    }
4

1 に答える 1