android - 将 AudioTrack 与 AudioManager setSpeakerphoneOn 一起使用

标签 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); 

此代码的问题是,当我关闭应用程序并启动音乐播放器时,声音来自前置扬声器,而不是通常的后置扬声器,我无法以某种方式更改它。 为了解决这个问题,我决定在关闭我的应用程序时添加以下行。

 m_amAudioManager.setSpeakerphoneOn(true);

但这条线的问题是,当我接到电话(正常电话)时,默认情况下扬声器是打开的。我真的需要帮助。

最佳答案

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

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

    oldAudioMode = audioManager.getMode();
    oldRingerMode = audioManager.getRingerMode();
    isSpeakerPhoneOn = audioManager.isSpeakerphoneOn();
    
  2. 应用您的音频设置(示例)

    audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
    audioManager.setMode(AudioManager.MODE_NORMAL);
    audioManager.setSpeakerphoneOn(true);
    
  3. 完成后,恢复设置

    audioManager.setSpeakerphoneOn(isSpeakerPhoneOn);
    audioManager.setMode(oldAudioMode);
    audioManager.setRingerMode(oldRingerMode);
    

关于android - 将 AudioTrack 与 AudioManager setSpeakerphoneOn 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14404820/

相关文章:

java - Activity 每次启动时都会增加 RAM 使用

android - 如何查看ArrayList中点击了哪个Button

android - AppExtension 类型对象的未知属性 dynamicFeatures

android - MODE_IN_CALL、MODE_IN_COMMUNICATION、MODE_CALL_SCREENING 有什么区别?

android - 如何从外部更新可组合状态?

java - AudioTrack WRITE_BLOCKING 与 WRITE_NON_BLOCKING

Android 音频流 - 在 AudioTrack 上获取静态噪声

android - 通过耳机播放音乐时通过扬声器播放声音

android - 音轨无法通过三星 S6 中的蓝牙工作

java - 如何仅将来电铃声静音而不将短信静音