Android 在插入线控耳机的情况下,切换音频外放

更新日期: 2024-10-30 阅读次数: 333 字数: 387 分类: Android

默认情况下,Android 系统跟 Windows 一样,插入耳机的时候,会自动将外放切换到耳机播放音频。

但是,遇到一个独特的需求,就是在插入耳线的情况下,可以由程序切换到外放。Windows 是可以在右下角手动切换外放设备,应该也有系统接口。我觉得 Android 也一样。

查了一下,确实可以。

Kotlin 实现方式

在 AndroidManifest.xml 中声明必要的权限:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

在 Main Activity 中切换外放设备:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager

    // 设置音频模式为扬声器
    audioManager.mode = AudioManager.MODE_IN_COMMUNICATION

    // 强制音频通过扬声器外放
    //audioManager.isSpeakerphoneOn = true  // 此方法已废弃
    println("耳线已插入:${audioManager.isWiredHeadsetOn}")
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        audioManager.availableCommunicationDevices.firstOrNull { it.type == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER }
            ?.let {
                audioManager.setCommunicationDevice(it)
            }
    } else {
        audioManager.isSpeakerphoneOn = true
    }
}

isSpeakerphoneOn 已废弃

所以才用 setCommunicationDevice 的实现

MODE_IN_COMMUNICATION 与 MODE_NORMAL 的区别

  • MODE_NORMAL : 普通模式,既不是铃声模式也不是通话模式
  • MODE_RINGTONE : 铃声模式
  • MODE_IN_CALL : 通话模式
  • MODE_IN_COMMUNICATION : 通信模式,包括音/视频,VoIP通话.(3.0加入的,与通话模式类似)

存在问题

在华为平板上,切换到外放后,大约五秒后,又自动静音了。或是切换回了耳线播放,这个我没有确认。感觉是华为系统的问题,待确认。

这个需求八字没有一撇,后续再继续调试一下。

参考

  • https://www.cnblogs.com/yongdaimi/p/11898816.html
  • https://stackoverflow.com/questions/72098404/setspeakerphoneon-from-audiomanager-is-not-changing-speakerphone-value-on-androi

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式