gpt4 book ai didi

Android 调用应用程序不重置音频流

转载 作者:行者123 更新时间:2023-12-05 05:59:25 25 4
gpt4 key购买 nike

我有一个单一的 Activity 应用程序设置为使用 self 管理的连接服务,因为我们正在使用音频和视频并且希望能够利用该系统。但是,我们关闭连接或可能更改音频流的方式导致了一个问题,我将在此尽力描述。

当我开始我们的应用程序通话时,一切都按照我们想要的方式进行,它以扬声器开始,但对扬声器按钮的按钮按下 react 良好,音频效果很好! 然而,当通话结束时,我的手机停留在一种模式,即任何通知都不会通过扬声器播放,而是通过听筒播放,这意味着我的所有通知都相当安静。我相信这一点是因为我们没有正确重置音频流。我不确定这是否意味着发生在 Connection 对象的 destroy() 中,或者更确切地说是发生在我们请求音频焦点等的 Activity 中……下面是我认为是罪魁祸首的代码

此方法初始化音频从单个 Activity 的 onResume() 调用。我们根据用户设备的构建版本走下两条不同的请求路径

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 实现中,因为我们使用的是 self 管理的连接服务,但我的第一直觉是上面的代码是问题所在。

最佳答案

我的一位团队成员发现了这个问题!经过大量调试...

When the call ends we were only closing the WebRTCPeer connection for the local participant, not all participants. So there was one WebRtcAudioTrack object left running. Calling close on all of them releases the audio resources and all stream routings are restored to their correct states.

故事的寓意是确保在结束通话时关闭所有连接!

关于Android 调用应用程序不重置音频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68168193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com