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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式