监听音频打断事件,该如何处理?

监听音频打断事件

HarmonyOS
2024-05-20 21:01:19
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
ychfang

在应用播放音频时,推荐应用监听音频打断事件,当音频打断事件发生时,系统会根据预设策略,对音频流做出相应的操作,并针对状态发生改变的音频流,向所属的应用发送音频打断事件。

应用收到音频打断事件后,需根据其内容提示,做出相应的处理,避免出现应用状态与预期效果不一致的问题。

监听音频打断事件的方法:

  • 使用AVPlayer开发音频播放功能,则可以调用AVPlayer的on('audioInterrupt')函数进行监听,当收到音频打断事件(InterruptEvent)时,应用需根据其内容,做出相应的调整。
  • 使用AudioRenderer开发音频播放功能,则可以调用AudioRenderer的on('audioInterrupt')函数进行监听,当收到音频打断事件(InterruptEvent)时,应用需根据其内容,做出相应的调整。
 audioRenderer.on('audioInterrupt', async(interruptEvent) => { 
    console.log('xxxx') 
    if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_FORCE) { 
      // 由系统进行操作,强制打断音频渲染,应用需更新自身状态及显示内容等 
      switch (interruptEvent.hintType) { 
        case audio.InterruptHint.INTERRUPT_HINT_PAUSE: 
        // 音频流已被暂停,临时失去焦点,待可重获焦点时会收到resume对应的interruptEvent 
          console.info('audioInterrupt111 Force paused. Update playing status and stop writing'); 
          let isPlaying = false; // 简化处理,代表应用切换至暂停状态的若干操作 
          break; 
        case audio.InterruptHint.INTERRUPT_HINT_STOP: 
        // 音频流已被停止,永久失去焦点,若想恢复渲染,需用户主动触发 
          console.info('audioInterrupt111 Force stopped. Update playing status and stop writing'); 
          isPlaying = false; // 简化处理,代表应用切换至暂停状态的若干操作 
          break; 
        case audio.InterruptHint.INTERRUPT_HINT_DUCK: 
        // 音频流已被降低音量渲染 
          console.info('audioInterrupt111 Force ducked. Update volume status'); 
          let isDucked = true; // 简化处理,代表应用更新音量状态的若干操作 
          break; 
        case audio.InterruptHint.INTERRUPT_HINT_UNDUCK: 
        // 音频流已被恢复正常音量渲染 
          console.info('audioInterrupt111 Force ducked. Update volume status'); 
          isDucked = false; // 简化处理,代表应用更新音量状态的若干操作 
          break; 
        default: 
          console.info('audioInterrupt111 Invalid interruptEvent'); 
          break; 
      } 
    } else if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_SHARE) { 
      // 由应用进行操作,应用可以自主选择打断或忽略 
      switch (interruptEvent.hintType) { 
        case audio.InterruptHint.INTERRUPT_HINT_RESUME: 
        // 建议应用继续渲染(说明音频流此前被强制暂停,临时失去焦点,现在可以恢复渲染) 
          console.info('audioInterrupt111 Resume force paused renderer or ignore'); 
        // 若选择继续渲染,需在此处主动执行开始渲染的若干操作 
          break; 
        case audio.InterruptHint.INTERRUPT_HINT_PAUSE: 
        // 建议应用暂停渲染 
          console.info('audioInterrupt111 Choose to pause or ignore'); 
        // 若选择暂停渲染,需在此处主动执行暂停渲染的若干操作 
          break; 
        case audio.InterruptHint.INTERRUPT_HINT_STOP: 
        // 建议应用停止渲染 
          console.info('audioInterrupt111 Choose to stop or ignore'); 
        // 若选择停止渲染,需在此处主动执行停止渲染的若干操作 
          break; 
        case audio.InterruptHint.INTERRUPT_HINT_DUCK: 
        // 建议应用降低音量渲染 
          console.info('audioInterrupt111 Choose to duck or ignore'); 
        // 若选择降低音量渲染,需在此处主动执行降低音量渲染的若干操作 
          break; 
        case audio.InterruptHint.INTERRUPT_HINT_UNDUCK: 
        // 建议应用恢复正常音量渲染 
          console.info('audioInterrupt111 Choose to unduck or ignore'); 
        // 若选择恢复正常音量渲染,需在此处主动执行恢复正常音量渲染的若干操作 
          break; 
        default: 
          break; 
      } 
    } 
  }); 
} 
  
let audioManager = audio.getAudioManager(); 
audioManager.on('interrupt', { 
  streamUsage:1, 
  contentType:0, 
  pauseWhenDucked:true 
}, (InterruptAction) => { 
  if (InterruptAction.actionType === 0) { 
    console.info('audioInterrupt111 An event to gain the audio focus starts.'); 
    console.info(`audioInterrupt111 Focus gain event: ${InterruptAction} `); 
  } 
  if (InterruptAction.actionType === 1) { 
    console.info('audioInterrupt111 An audio interruption event starts.'); 
    console.info(`audioInterrupt111 Audio interruption event: ${InterruptAction} `); 
  } 
});

适配版本信息

1. 本示例为Stage模型,支持API version 10。

2. 本示例使用DevEco Studio    4.0.3.600 版本进行编译运行。

分享
微博
QQ
微信
回复
2024-05-21 16:41:04
相关问题
注册监听关机事件如何处理
414浏览 • 1回复 待解决
权限的申请与校验,如何处理啊?
396浏览 • 1回复 待解决
ArkTS语法校验报错,如何处理啊?
347浏览 • 1回复 待解决
父组件中如何处理子组件内点击事件
1068浏览 • 1回复 待解决
应用线程过多时如何处理
564浏览 • 1回复 待解决
如何处理Redis的内存优化?
1577浏览 • 1回复 待解决
ArkTS后台代理提醒,需要如何处理
335浏览 • 1回复 待解决
如何处理webview显示元素尺寸过小
571浏览 • 1回复 待解决
如何处理应用卡死(appfreeze)问题
637浏览 • 1回复 待解决
如何处理消息被频控的问题
582浏览 • 1回复 待解决
如何处理HAR之间的互相依赖
821浏览 • 1回复 待解决
错误rowCount返回值-1如何处理
377浏览 • 1回复 待解决
如何处理推送数量不够用问题
617浏览 • 1回复 待解决
求大佬告知如何处理误分类问题
630浏览 • 1回复 待解决
如何处理应用存在的URL硬编码?
311浏览 • 1回复 待解决