Flutter:如何在 Android 上的其他应用程序中恢复音频播放

问题描述 投票:0回答:1

问题

我正在使用

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 设备上会出现相同的行为。尚未在旧设备上进行测试。

android flutter dart just-audio
1个回答
0
投票

我不知道这是设计使然、错误还是由于我做错了什么,但

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
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.