HarmonyOS鸿蒙Next中采用AVRecorder录制音频,如何监听电话来了打断?
HarmonyOS鸿蒙Next中采用AVRecorder录制音频,如何监听电话来了打断?
采用AVRecorder录制音频过程中,如何监听电话来了打断? 官网找到的资料都是这个,应该怎么选呢?
使用不同方式开发时,如何监听音频焦点事件:
- 
若使用AVPlayer开发音频播放功能(ArkTS) ,可以调用on(‘audioInterrupt’) 接口,监听音频焦点事件InterruptEvent。 
- 
若使用AVPlayer开发音频播放功能(C/C++) ,可以调用OH_AVPlayer_SetOnInfoCallback() 接口,监听音频焦点事件OH_AVPlayerOnInfoCallback。 
- 
若使用AudioRenderer开发音频播放功能 ,可以调用on(‘audioInterrupt’) 接口,监听音频焦点事件InterruptEvent。 
- 
若使用OHAudio开发音频播放功能(C/C++) ,可以调用OH_AudioStreamBuilder_SetRendererCallback 接口,监听音频焦点事件OH_AudioRenderer_OnInterruptEvent。 
- 
若使用AudioCapturer开发音频录制功能 ,可以调用on(‘audioInterrupt’) 接口,监听音频焦点事件InterruptEvent。 
- 
若使用OHAudio开发音频录制功能(C/C++) ,可以调用OH_AudioStreamBuilder_SetCapturerCallback 接口,监听音频焦点事件OH_AudioCapturer_OnInterruptEvent。 
更多关于HarmonyOS鸿蒙Next中采用AVRecorder录制音频,如何监听电话来了打断?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
注册音频中断监听
import audio from '@kit.MediaKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 在AVRecorder初始化完成后注册监听
private registerInterruptListener() {
  try {
    this.avRecorder.on('audioInterrupt', (interruptEvent: audio.InterruptEvent) => {
      this.handleAudioInterrupt(interruptEvent);
    });
  } catch (error) {
    console.error(`监听注册失败: ${(error as BusinessError).message}`);
  }
}
// 使用箭头函数保持this指向
private handleAudioInterrupt = (event: audio.InterruptEvent) => {
  if (event.hintType === audio.InterruptHint.INTERRUPT_HINT_STOP) {
    this.releaseRecorder();
    console.info('电话中断导致录制终止');
  }
};
中断恢复处理
private async restartRecording() {
  await this.releaseRecorder(); // 释放当前实例
  await this.initAVRecorder();  // 重新初始化
  await this.avRecorder.start(); 
}
private async releaseRecorder() {
  if (this.avRecorder.state === 'started') {
    await this.avRecorder.stop();
  }
  await this.avRecorder.reset();
  this.avRecorder.off('audioInterrupt'); // 取消旧监听
}
更多关于HarmonyOS鸿蒙Next中采用AVRecorder录制音频,如何监听电话来了打断?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在鸿蒙系统中,使用 AVRecorder 录制音频时监听电话打断事件,需通过音频中断管理(audioInterrupt) 实现。以下是详细步骤和代码示例:
核心思路
- 
创建音频中断管理器 
 通过audioInterrupt模块监听系统音频焦点变化事件(如来电打断)。
- 
注册中断事件回调 
 在回调中处理录制暂停/恢复逻辑。
- 
适配 AVRecorder 操作 
 根据中断事件暂停或恢复录制。
实现步骤(ArkTS 示例)
1. 导入模块
import audioInterrupt from '@ohos.multimedia.audioInterrupt';
import audio from '@ohos.multimedia.audio';
import media from '@ohos.multimedia.media';
import common from '@ohos.app.ability.common';
2. 初始化音频中断管理器
// 获取音频组 ID(默认组)
let groupId: number = audio.DEFAULT_AUDIO_GROUP_ID;
// 创建音频中断管理器
let audioInterruptManager: audioInterrupt.AudioInterruptManager;
try {
    audioInterruptManager = audioInterrupt.createAudioInterruptManager(groupId);
} catch (err) {
    console.error(`创建音频中断管理器失败: ${err.message}`);
}
3. 注册中断事件监听
// 定义中断事件回调
audioInterruptManager.on('interrupt', (interruptEvent: audioInterrupt.InterruptEvent) => {
    switch (interruptEvent.hintType) {
        case audioInterrupt.InterruptHint.INTERRUPT_HINT_PAUSE:
            // 系统要求暂停(如来电)
            if (avRecorder && avRecorder.state === 'started') {
                avRecorder.pause(); // 暂停录制
            }
            break;
        case audioInterrupt.InterruptHint.INTERRUPT_HINT_RESUME:
            // 系统允许恢复(如电话结束)
            if (avRecorder && avRecorder.state === 'paused') {
                avRecorder.resume(); // 恢复录制
            }
            break;
    }
});
4. 初始化 AVRecorder 并开始录制
let avRecorder: media.AVRecorder | null = null;
// 配置录制参数
let profile: media.AVRecorderProfile = {
    audioBitrate: 48000,
    audioChannels: 2,
    audioCodec: media.CodecMimeType.AUDIO_AAC,
    audioSampleRate: 48000,
    fileFormat: media.ContainerFormatType.CFT_MPEG_4,
}
// 创建 AVRecorder 实例
media.createAVRecorder((err, recorder) => {
    if (err) {
        console.error(`createAVRecorder 失败: ${err.message}`);
        return;
    }
    avRecorder = recorder;
    // 设置录制配置
    avRecorder.prepare({
        audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC,
        profile: profile,
        url: '文件保存路径.mp4', // 替换实际路径
    });
    // 开始录制
    avRecorder.start();
});
5. 释放资源(录制结束时)
// 停止录制并释放资源
if (avRecorder) {
    avRecorder.stop();
    avRecorder.release();
}
// 移除中断监听
audioInterruptManager.off('interrupt');
audioInterruptManager.release();
关键说明
- 
中断事件类型: - INTERRUPT_HINT_PAUSE:系统强制暂停(如来电、闹钟)。
- INTERRUPT_HINT_RESUME:系统允许恢复录制。
 
- 
AVRecorder 状态管理: - 在 pause()和resume()前检查状态,避免非法调用。
- 电话挂断后会自动触发 INTERRUPT_HINT_RESUME。
 
- 在 
- 
权限要求: - 麦克风权限:ohos.permission.MICROPHONE
- 存储权限:ohos.permission.WRITE_MEDIA
 
- 麦克风权限:
- 
兼容性: - 此方案适用于鸿蒙 3.1+ 系统版本。
- 低版本需检查 audioInterrupt模块支持情况。
 
替代方案(直接使用 AudioCapturer)
如果 AVRecorder 无法满足需求,可改用底层 AudioCapturer(需手动处理音频数据):
import audio from '@ohos.multimedia.audio';
// 创建 AudioCapturer 实例
let audioCapturer: audio.AudioCapturer = ...;
// 注册中断监听
audioCapturer.on('audioInterrupt', (interruptEvent: audio.InterruptEvent) => {
    if (interruptEvent.forceType == audio.InterruptForceType.INTERRUPT_FORCE) {
        audioCapturer.pause(); // 强制暂停
    }
});
总结
- 推荐方案:使用 audioInterrupt模块监听全局音频焦点变化,配合AVRecorder.pause()/resume()控制录制。
- 注意事项:
- 确保正确管理 AVRecorder生命周期。
- 在 on('interrupt')回调中处理异步操作。
- 测试不同中断场景(如来电、语音助手)。
 
- 确保正确管理 
通过此方案,即可在电话呼入时自动暂停录制,电话结束后恢复录制,保证录制过程符合系统音频管理策略。
在HarmonyOS Next中监听电话打断,可以通过AVRecorder的on(‘interrupt’)事件实现。当有电话呼入时,系统会触发该事件。示例代码:
let avRecorder = await media.createAVRecorder();
avRecorder.on('interrupt', (interruptEvent) => {
  if (interruptEvent === media.InterruptEvent.CALL) {
    // 处理电话打断
  }
});
需要声明ohos.permission.READ_CALL_LOG权限。该事件会在来电时自动暂停录制。
在HarmonyOS Next中使用AVRecorder录制音频时,可以通过AudioManager的音频焦点机制来监听电话打断事件。建议采用以下方案:
- 对于ArkTS开发,使用AudioManager的on(‘audioInterrupt’)接口监听中断事件:
import audio from '@ohos.multimedia.audio';
let audioManager = audio.getAudioManager();
audioManager.on('audioInterrupt', (interruptEvent) => {
  if (interruptEvent.forceType === audio.InterruptForceType.INTERRUPT_FORCE) {
    // 处理电话打断逻辑
    avRecorder.pause(); // 暂停录制
  }
});
- 关键参数说明:
- INTERRUPT_FORCE表示强制中断(如来电)
- 事件触发后应立即暂停AVRecorder
- 可通过interruptEvent.hintType判断具体中断类型
- 录制恢复处理:
audioManager.on('audioInterrupt', (interruptEvent) => {
  if (interruptEvent.hintType === audio.InterruptHint.INTERRUPT_HINT_RESUME) {
    avRecorder.resume(); // 恢复录制
  }
});
注意要在应用退出时取消监听:
audioManager.off('audioInterrupt');
 
        
       
                   
                   
                  

