[英]Bug in the MODE_IN_COMMUNICATION in android audiomanager?
[英]AudioManager is introducing delay in the setMode(MODE_IN_COMMUNICATION)
即使耳机打开,我也试图在扬声器上播放声音,但如果背景中有音乐播放,我希望在播放声音之前在耳机上播放音乐。
所以我正在采取以下步骤:
MODE_COMMUNICATION
设置为AudioManager,这样声音就可以在扬声器上播放了。MODE_NORMAL
到AudioManager
,所以背景音乐仍然可以在耳机播放。 奇怪的是它取决于设备,在某些设备上这是可以的,但是在设置MODE_COMMUNICATION
后在 Nexus 6P(华为)设备上有延迟 3-4 秒才能播放声音。 如果我没有延迟地播放声音,那么它既不会播放到扬声器也不会播放到耳机。
问题
我怎么知道在播放声音之前要设置多少延迟? 有没有我可以附加的侦听器,所以可以通知我在设置MODE_COMMUNICATION
后声音可以播放了吗?
即使没有必要,我也不想设置延迟!
解决方案不是在类的构造函数中设置模式(跳过延迟),因为我需要在特定时刻在扬声器上播放声音!
PS:我正在使用AudioTrack
播放声音,但我也尝试使用MediaPlayer
(设置setAudioStreamType(MODE_IN_COMMUNICATION)
),但没有成功,延迟仍然存在!
那么有什么建议吗?
万一有人偶然发现这篇文章,对我AudioManager.setMode()
是调用AudioManager.setMode()
然后重新创建我的MediaPlayer
(通过构造函数,而不是create()
)并使用setAudioAttributes()
来更改输出源。
科特林片段:
fun switchOutput(inCommunication: Boolean) {
//STEP 1: Change the AudioManager's audio mode
if(inCommunication) {
audioManager.mode = AudioManager.MODE_IN_CALL
audioManager.isSpeakerphoneOn = false
} else {
audioManager.mode = AudioManager.MODE_NORMAL
audioManager.isSpeakerphoneOn = true
}
//STEP 2: Recreate the MediaPlayer
if (player != null) {
try {
player?.stop()
} catch (e: RuntimeException) {
} finally {
player?.reset()
player?.release()
player = null
}
}
player = MediaPlayer()
try {
val streamType =
if (inCommunication) AudioManager.STREAM_VOICE_CALL
else AudioManager.STREAM_MUSIC
player?.setDataSource(dataSource)
player?.setAudioAttributes(AudioAttributes.Builder()
.setLegacyStreamType(streamType)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build())
player?.prepare()
player?.start()
} catch (e: java.lang.Exception) {}
}
希望这可以帮助 :)
PS 注意我使用了MODE_IN_CALL
而不是MODE_IN_COMMUNICATION
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.