HarmonyOS 鸿蒙Next 音频打断处理策略推荐

HarmonyOS 鸿蒙Next 音频打断处理策略推荐

实现方案

       当与其他应用的音频发生冲突,多个音频流同时播放时,系统预设了音频打断策略,对多音频的并发进行管控,只有持有音频焦点的音频流才可以正常播放,避免多个音频流无序并发播放的现象出现。为了维持应用和系统的状态一致性,保证符合用户直觉的交互体验,推荐应用监听音频打断事件,并在收到音频打断事件(InterruptEvent)时做出相应处理。对于视频类应用,被各种类型的其他应用音频打断场景和效果如下表所示:

被打断视频期望效果

参考打断效果

涉及的后起流应用音频类型

参考代码示例

打断暂停

后播应用播放时,先播应用暂停播放;后播应用停止播放后,先播应用恢复播放(音频停止后,如果存在对应的播放画面也建议将其停止)。

电话

audioRenderer.on(‘audioInterrupt’, async(interruptEvent: audio.InterruptEvent) => {

  if (interruptEvent.forceType === audio.InterruptForceType.INTERRUPT_FORCE) {

    // 强制打断类型(INTERRUPT_FORCE):音频相关处理已由系统执行,应用需更新自身状态,做相应调整

    switch (interruptEvent.hintType) {

      case audio.InterruptHint.INTERRUPT_HINT_PAUSE:

      // 此分支表示系统已将音频流暂停(临时失去焦点),为保持状态一致,应用需切换至音频暂停状态

      // 临时失去焦点:待其他音频流释放音频焦点后,本音频流会收到resume对应的音频打断事件,到时可自行继续播放

        isPlay = false; // 此句为简化处理,代表应用切换至音频暂停状态的若干操作

        break;

      default:

        break;

    }

  }

}) 

// 订阅通话业务状态变化

import { observer } from ‘@kit.TelephonyKit’;

observer.on(‘callStateChange’, (data: observer.CallStateInfo) => {

  console.log(“on callStateChange, data:” + JSON.stringify(data));

  if(data.state == call.CallState.CALL_STATE_IDLE) {

  // 电话挂断后被暂停的音频流此时可以继续播放,建议应用继续播放,切换至音频播放状态

  // 若应用此时不想继续播放,可以忽略此音频打断事件,不进行处理即可

  // 继续播放,此处主动执行start(),以标识符变量started记录start()的执行结果

    await audioRenderer.start().then(() => {

      started = true; // start()执行成功

    }).catch((err: BusinessError) => {

      started = false; // start()执行失败

    });

    // 若start()执行成功,则切换至音频播放状态

    if (started) {

      isPlay = true; // 此句为简化处理,代表应用切换至音频播放状态的若干操作

    } else {

    // 音频继续播放执行失败

    }

  }

});

闹钟

audioRenderer.on(‘audioInterrupt’, async (interruptEvent: audio.InterruptEvent) => {

  if (interruptEvent.forceType === audio.InterruptForceType.INTERRUPT_FORCE) {

    // 强制打断类型(INTERRUPT_FORCE):音频相关处理已由系统执行,应用需更新自身状态,做相应调整

    switch (interruptEvent.hintType) {

      case audio.InterruptHint.INTERRUPT_HINT_PAUSE:

      // 此分支表示系统已将音频流暂停(临时失去焦点),为保持状态一致,应用需切换至音频暂停状态

      // 临时失去焦点:待其他音频流释放音频焦点后,本音频流会收到resume对应的音频打断事件,到时可自行继续播放

        isPlay = false; // 此句为简化处理,代表应用切换至音频暂停状态的若干操作

        break;

      default:

        break;

    }

  } else if (interruptEvent.forceType === audio.InterruptForceType.INTERRUPT_SHARE) {

    // 共享打断类型(INTERRUPT_SHARE):应用可自主选择执行相关操作或忽略音频打断事件

    switch (interruptEvent.hintType) {

      case audio.InterruptHint.INTERRUPT_HINT_RESUME:

      // 此分支表示临时失去焦点后被暂停的音频流此时可以继续播放,建议应用继续播放,切换至音频播放状态

      // 若应用此时不想继续播放,可以忽略此音频打断事件,不进行处理即可

      // 继续播放,此处主动执行start(),以标识符变量started记录start()的执行结果

        await audioRenderer.start().then(() => {

          started = true; // start()执行成功

        }).catch((err: BusinessError) => {

          started = false; // start()执行失败

        });

      // 若start()执行成功,则切换至音频播放状态

        if (started) {

          isPlay = true; // 此句为简化处理,代表应用切换至音频播放状态的若干操作

        } else {

          // 音频继续播放执行失败

        }

        break;

      default:

        break;

    }

  }

});

铃声

VOIP 铃声(全屏呼叫/呼叫页面/横幅呼叫)

VOIP 通话

VOIP MESSAGE(微信语音/畅联)

打断停止

后播应用播放/录制时,先播应用停止播放;后播应用停止播放/录制后,先播应用不再恢复播放。

音乐

audioRenderer.on(‘audioInterrupt’, async (interruptEvent: audio.InterruptEvent) => {

  if (interruptEvent.forceType === audio.InterruptForceType.INTERRUPT_FORCE) {

    // 强制打断类型(INTERRUPT_FORCE):音频相关处理已由系统执行,应用需更新自身状态,做相应调整

    switch (interruptEvent.hintType) {

      case audio.InterruptHint.INTERRUPT_HINT_STOP:

      // 此分支表示系统已将音频流停止(永久失去焦点),为保持状态一致,应用需切换至音频暂停状态

      // 永久失去焦点:后续不会再收到任何音频打断事件,若想恢复播放,需要用户主动触发。

        isPlay = false; // 此句为简化处理,代表应用切换至音频暂停状态的若干操作

        break;

      default:

        break;

    }

  }

});

视频

普通录音

音量压低

后播应用播放时,先播应用降低音量持续播放;后播应用停止播放后,先播应用恢复音量继续播放。

导航

audioRenderer.on(‘audioInterrupt’, async (interruptEvent: audio.InterruptEvent) => {

  if (interruptEvent.forceType === audio.InterruptForceType.INTERRUPT_FORCE) {

    // 强制打断类型(INTERRUPT_FORCE):音频相关处理已由系统执行,应用需更新自身状态,做相应调整

    switch (interruptEvent.hintType) {

      case audio.InterruptHint.INTERRUPT_HINT_DUCK:

      // 此分支表示系统已将音频音量降低(默认降到正常音量的20%)

        isDucked = true; // 此句为简化处理,代表应用切换至降低音量播放状态的若干操作

        break;

      case audio.InterruptHint.INTERRUPT_HINT_UNDUCK:

      // 此分支表示系统已将音频音量恢复正常

        isDucked = false; // 此句为简化处理,代表应用切换至正常音量播放状态的若干操作

        break;

      default:

        break;

    }

  }

});

TextReader控件朗读语音

语音助手类短语音

并发播放

先播、后播应用并发混音播放。

游戏

此行为是系统默认行为,应用侧不需要适配。

系统音效(锁屏/按键)


更多关于HarmonyOS 鸿蒙Next 音频打断处理策略推荐的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next 音频打断处理策略推荐的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


作为IT专家,对于HarmonyOS 鸿蒙Next框架中的音频打断处理策略,我推荐以下处理方式:

HarmonyOS 鸿蒙Next框架预设了音频打断策略,以管理多个音频流同时播放时的交互和优先级,避免混音混乱。该策略的核心是音频焦点管理,只有持有音频焦点的音频流才可以正常播放。

应用开始播放音频时,系统会为音频流申请音频焦点。若焦点申请被拒绝,则音频无法播放。播放过程中,若音频流被其他音频流打断,则会失去焦点并暂停播放。这些动作由系统自行完成,但为保证良好的用户体验,应用应主动监听音频打断事件(InterruptEvent),并在收到事件时做出相应处理。

音频打断策略预设了两种焦点模式:共享焦点模式和独立焦点模式。共享焦点模式下,同一应用创建的多个音频流共享一个音频焦点;独立焦点模式下,每个音频流独立拥有一个音频焦点。应用可按需选择焦点模式,并在创建音频流时设置。

音频打断策略还预置了两种打断类型:强制打断类型和共享打断类型。强制打断类型由系统操作,共享打断类型由应用操作。应用可根据音频打断事件的成员变量forceType的值,获取事件采用的打断类型,并据此做出处理。

对于音频打断策略的执行,应用需确保与系统的状态一致性,避免出现应用状态与预期效果不一致的问题。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部