默认情况下,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 聊聊, 查看更多联系方式