HarmonyOS鸿蒙Next中兼容性:静音播放场景的焦点策略为stop,未采用share音频焦点策略

HarmonyOS鸿蒙Next中兼容性:静音播放场景的焦点策略为stop,未采用share音频焦点策略

app审核的时候审核人员反馈了这么一条 我没看懂什么意思

这条意见还附带了一张截图 截图中的按钮和播放还一点关系没有 我怀疑是机审有bug

咨询后告诉我 就是说我的app在播放的过程中不能影响其它app的声音 之后给我了我一个文档但是我依然没看懂需要怎么修改  T_T

现在有几个问题需要请教下

1. 我使用的是avplay进行播放 我看文档里avplay的 audioInterruptMode默认就是SHARE_MODE模式 不需要额外设置

2. 什么是静音播放场景,我的播放的是纯音频,又不是视频哪来的什么静音播放场景,静音的话我和别的app都没有声音了 都没声了我怎么影响别的app

3. 我试验了 切到后台、唤起小艺还有系统闹钟响起的时候 avplay都会自动暂停 我也不会影响别的应用

所以请教下这个问题应该怎么改 静音场景是什么场景 显示应该是什么样的 预期实现应该是什么样的

最好能直接发我代码 感谢🙏

更多关于HarmonyOS鸿蒙Next中兼容性:静音播放场景的焦点策略为stop,未采用share音频焦点策略的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

审核反馈的"静音播放场景焦点策略为stop"指的是当您的应用处于静音播放状态时(后台播放或系统音量调零),未正确采用SHARE_MODE音频焦点共享策略,导致可能影响其他应用的音频播放。这与纯音频播放场景的特性相关。

AVPlayer的audioInterruptMode默认确实是SHARE_MODE,但当应用处于静音状态时(用户主动调零音量、系统强制静音等场景),焦点策略可能自动切换为STOP_MODE。需要显式设置:

let avPlayer: media.AVPlayer = new media.AVPlayer();

avPlayer.audioInterruptMode = media.InterruptMode.SHARE_MODE; // 强制保持共享模式

静音播放场景包括:

  • 用户手动将应用音量调至零
  • 系统事件触发静音(电话接入)
  • 通过物理按键触发的全局静音

此时即使应用处于播放状态,仍需要确保音频焦点策略正确。建议楼主添加状态监听:

avSession.on('audioInterrupt', (interruptEvent: avSession.AudioInterruptEvent) => {
  if (interruptEvent.forceMuted) { // 系统强制静音时
    avPlayer.audioInterruptMode = media.InterruptMode.SHARE_MODE;
  }
});

更多关于HarmonyOS鸿蒙Next中兼容性:静音播放场景的焦点策略为stop,未采用share音频焦点策略的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我也遇到这问题了,咨询过人工客服,具体回复根据如下建议修改。

【兼容性】

在音视频静音播放场景下,应用/元服务在静音播放时需采用share音频焦点策略,不得打断其他音频业务播放。

规范文档见:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/audio-specification

音频焦点开发参考(适配audiosession即可):

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/audio-playback-concurrency

巧了,我也是昨天遇到了这个问题。

他的意思是你的音频播放被系统闹钟打断了,你取消闹钟后你的音频能继续播放。

参考:https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-audio-focus-management

this.audioRenderer.on('audioInterrupt', async (interruptInfo: audio.InterruptEvent) => {
    let playbackState: avSession.AVPlaybackState = {
        state: avSession.PlaybackState.PLAYBACK_STATE_PLAY,
        loopMode: avSession.LoopMode.LOOP_MODE_SINGLE
    };

    if (interruptInfo.forceType === audio.InterruptForceType.INTERRUPT_SHARE &&
        interruptInfo.hintType === audio.InterruptHint.INTERRUPT_HINT_RESUME) {
        Logger.info('audio resume play.');
        this.audioRenderer?.start().catch((err: BusinessError) => {
            Logger.error(TAG, `audio resume failed,code is ${err.code},message is ${err.message}`);
        })
    } else if (interruptInfo.forceType === audio.InterruptForceType.INTERRUPT_FORCE &&
        (interruptInfo.hintType === audio.InterruptHint.INTERRUPT_HINT_PAUSE ||
         interruptInfo.hintType === audio.InterruptHint.INTERRUPT_HINT_STOP)) {
        playbackState.state = avSession.PlaybackState.PLAYBACK_STATE_PAUSE;
    }

    await this.avSessionController?.session?.setAVPlaybackState(playbackState);
})

他的意思是让你Controller 用stop方法,别用pause

在HarmonyOS Next中,静音播放场景默认使用stop音频焦点策略,而非share策略。stop策略会完全释放音频焦点,其他应用获取焦点后可独占播放;share策略则允许混合播放。该设计基于静音场景不需要持续占用音频资源的考虑。开发者可通过修改AudioManager的焦点请求参数调整策略,使用requestAudioFocus()方法明确指定焦点行为。

关于您提到的HarmonyOS Next音频焦点问题,我来简要说明几点:

  1. 音频焦点策略问题:
  • 审核反馈的核心是要求正确处理音频焦点冲突
  • 虽然AVPlayer默认是SHARE_MODE,但某些特殊场景可能需要显式设置
  1. 静音播放场景:
  • 指应用在后台或特定状态下(如锁屏)的音频播放行为
  • 即使您的应用是纯音频,系统也会考虑这种场景
  1. 解决方案建议:
// 显式设置音频焦点模式
let avPlayer: media.AVPlayer = await media.createAVPlayer();
avPlayer.audioInterruptMode = media.AudioInterruptMode.SHARE_MODE;

// 处理焦点变化事件
avPlayer.on('audioInterrupt', (interruptEvent) => {
  // 根据系统通知处理焦点变化
});
  1. 验证要点:
  • 确保在后台播放时不会阻止其他应用获取焦点
  • 测试与其他音频应用(如音乐播放器)同时运行的场景
  • 检查系统通知/来电时的音频行为

建议检查应用是否有特殊场景覆盖了默认行为,或尝试显式设置SHARE_MODE。

回到顶部