将AudioTrack与AudioManager setSpeakerphoneOn配合使用

SoH*_*SoH 8 android audiotrack android-audiomanager

我正在使用AudioTrack播放我通过UDP套接字收到的声音.我和声音一起发出很多噪音,所以我决定使用AudioManager.但是AudioManager会将声音路由更改为超出应用程序的范围.以下是我正在使用的代码.

        m_amAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 
        m_amAudioManager.setMode(AudioManager.MODE_IN_CALL); 
        m_amAudioManager.setSpeakerphoneOn(false); 
Run Code Online (Sandbox Code Playgroud)

这段代码的问题在于,当我关闭应用程序并启动音乐播放器时,声音来自前置扬声器而不是后置扬声器,我不能以某种方式改变它.要解决此问题,我决定在关闭应用时添加以下行.

 m_amAudioManager.setSpeakerphoneOn(true);
Run Code Online (Sandbox Code Playgroud)

但是对于这条线,问题是当我接到一个电话(正常通话)时,默认情况下扬声器开启.我真的需要帮助.

Tou*_*der 13

首先,您需要在清单中声明用户权限MODIFY_AUDIO_SETTINGS以更改AudioManager设置.

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
Run Code Online (Sandbox Code Playgroud)
  1. 在更改任何设置之前,必须保存当前的AudioManager设置!

    oldAudioMode = audioManager.getMode();
    oldRingerMode = audioManager.getRingerMode();
    isSpeakerPhoneOn = audioManager.isSpeakerphoneOn();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 应用音频设置(示例)

    audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
    audioManager.setMode(AudioManager.MODE_NORMAL);
    audioManager.setSpeakerphoneOn(true);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后在完成后,恢复设置

    audioManager.setSpeakerphoneOn(isSpeakerPhoneOn);
    audioManager.setMode(oldAudioMode);
    audioManager.setRingerMode(oldRingerMode);
    
    Run Code Online (Sandbox Code Playgroud)