如何解决Android 通话应用未重置音频流
我设置了一个活动应用程序以使用自我管理的连接服务,因为我们正在使用音频和视频并希望能够利用该系统。但是,我们关闭连接或可能更改音频流的方式导致了一个问题,我将在这里尽我所能来描述。
当我开始我们的应用程序的呼叫时,一切都按照我们想要的方式工作,它在免提电话中启动,但对免提电话按钮的按下反应很好,音频效果很好! 然而,当通话结束时,我的手机处于一种模式,任何通知都不会通过扬声器播放,而是通过听筒播放,这意味着我的所有通知都很安静。我相信这一点是因为我们没有正确重置音频流。我不确定这是否意味着发生在 Connection 对象的 destroy() 中,或者更确切地说是发生在我们请求音频焦点等的活动中......下面是我认为是罪魁祸首的代码
这个方法初始化音频是从单个Activity的onResume()调用的。我们根据用户设备的 Build 版本沿着两种不同的请求路径进行
private fun initializeAudio() {
if (!audioManager.isInCall()) {
volumeControlStream = AudioManager.STREAM_VOICE_CALL
// Request audio focus for playback
val result: Int = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
audioManager.requestAudioFocus(focusRequest)
} else {
@Suppress("DEPRECATION")
audioManager.requestAudioFocus(
afchangelistener,AudioManager.STREAM_VOICE_CALL,AudioManager.AUdioFOCUS_GAIN
)
}
if (result != AudioManager.AUdioFOCUS_REQUEST_GRANTED) {
StreemLog.logError(TAG,"Audio focus request denied",sendBreadcrumb = true)
}
}
}
这里是新版本的 AudioFocusRequest
private val focusRequest: AudioFocusRequest by lazy {
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
AudioFocusRequest.Builder(AudioManager.AUdioFOCUS_GAIN).run {
setAudioAttributes(
AudioAttributes.Builder().run {
setLegacyStreamType(AudioManager.STREAM_VOICE_CALL)
setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
build()
}
)
setonAudioFocuschangelistener(afchangelistener)
build()
}
} else throw IllegalStateException("Trying to use AudioFocusRequest below minimum API 26")
}
这里是过时的 OnAudioFocuschangelistener
private val afchangelistener: AudioManager.OnAudioFocuschangelistener =
AudioManager.OnAudioFocuschangelistener { focusChange ->
when (focusChange) {
AudioManager.AUdioFOCUS_LOSS -> {
tearDownAudio()
}
AudioManager.AUdioFOCUS_LOSS_TRANSIENT -> {
// noop
}
AudioManager.AUdioFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
// noop
}
AudioManager.AUdioFOCUS_GAIN -> {
initializeAudio()
}
}
}
最后,我们有我们在 Activity 中从 onPause() 调用的 tearDownAudio() 方法
private fun tearDownAudio() {
volumeControlStream = AudioManager.USE_DEFAULT_STREAM_TYPE
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
audioManager.abandonAudioFocusRequest(focusRequest)
} else {
@Suppress("DEPRECATION")
audioManager.abandonAudioFocus(afchangelistener)
}
}
我的猜测是问题出在 tearDownAudio() 方法中,因为设备上的音频在通话开始和通话期间效果很好,但在通话结束后不会返回正常流。
问题也可能存在于 ConnectionService 实现中,因为我们使用的是自我管理的连接服务,但我的第一直觉是上述代码是问题所在。
解决方法
我的一名团队成员发现了这个问题!经过大量调试...
当通话结束时,我们只是关闭了本地参与者的 WebRTCPeer 连接,而不是所有参与者。所以只有一个 WebRtcAudioTrack 对象在运行。对所有这些调用 close 会释放音频资源,并且所有流路由都恢复到正确的状态。
这个故事的寓意是确保在结束通话时关闭所有连接!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。