我正在使用
just_audio
以及 audio_session
在我的应用程序中播放音频。当我的应用程序播放音频时,我希望其他应用程序的音频停止或闪避,并在我的应用程序停止音频时恢复/取消闪避。
这就是我目前对audio_session的看法:
final session = await AudioSession.instance;
await session.configure(AudioSessionConfiguration(
androidAudioFocusGainType: AndroidAudioFocusGainType.gainTransientMayDuck,
androidWillPauseWhenDucked: false,
));
这就是我播放音频的方式:
AudioPlayer activePlayer = AudioPlayer(handleInterruptions: true);
await activePlayer.setAndroidAudioAttributes(AndroidAudioAttributes(
usage: AndroidAudioUsage.alarm,
contentType: AndroidAudioContentType.music,
));
await activePlayer.setLoopMode(loopMode);
await activePlayer.setAudioSource(AudioSource.uri(Uri.parse(ringtoneUri)));
await activePlayer.setVolume(volume);
// Other apps audio should stop/duck here
activePlayer?.play();
...
// Other apps audio should resume/unduck here
await activePlayer?.stop();
其他应用程序的音频确实会在
play()
上闪避(音量降低),但不会在 stop()
上闪避(恢复正常音量)。尝试过使用多个其他应用程序。
编辑:当我的应用程序关闭时,似乎其他应用程序获得焦点。这意味着我需要调用
stop()
以外的其他方法来释放我的应用程序的焦点?
我在这里做错了什么?
我目前正在 Android 14(Google API)模拟器上进行测试。但在 Android 13 设备上会出现相同的行为。尚未在旧设备上进行测试。
我不知道这是设计使然、错误还是由于我做错了什么,但
just_audio
永远不会自动放弃音频焦点。您必须通过 audio_session
自己调用 session.setActive(false)
。
AudioPlayer activePlayer = AudioPlayer(handleInterruptions: true);
await activePlayer.setAndroidAudioAttributes(AndroidAudioAttributes(
usage: AndroidAudioUsage.alarm,
contentType: AndroidAudioContentType.music,
));
await activePlayer.setLoopMode(loopMode);
await activePlayer.setAudioSource(AudioSource.uri(Uri.parse(ringtoneUri)));
await activePlayer.setVolume(volume);
// Other apps audio should stop/duck here
await activePlayer?.play();
...
// Other apps audio should resume/unduck here
await activePlayer?.stop();
final session = await AudioSession.instance;
await session.setActive(false); // <-- Need to call this after audio stops