HarmonyOS鸿蒙Next中采用AVRecorder录制音频,如何监听电话来了打断?

HarmonyOS鸿蒙Next中采用AVRecorder录制音频,如何监听电话来了打断?

采用AVRecorder录制音频过程中,如何监听电话来了打断? 官网找到的资料都是这个,应该怎么选呢?

使用不同方式开发时,如何监听音频焦点事件:


更多关于HarmonyOS鸿蒙Next中采用AVRecorder录制音频,如何监听电话来了打断?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

注册音频中断监听

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) 实现。以下是详细步骤和代码示例:

核心思路

  1. 创建音频中断管理器
    通过 audioInterrupt 模块监听系统音频焦点变化事件(如来电打断)。

  2. 注册中断事件回调
    在回调中处理录制暂停/恢复逻辑。

  3. 适配 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();

关键说明

  1. 中断事件类型

    • INTERRUPT_HINT_PAUSE:系统强制暂停(如来电、闹钟)。
    • INTERRUPT_HINT_RESUME:系统允许恢复录制。
  2. AVRecorder 状态管理

    • pause()resume() 前检查状态,避免非法调用。
    • 电话挂断后会自动触发 INTERRUPT_HINT_RESUME
  3. 权限要求

    • 麦克风权限:ohos.permission.MICROPHONE
    • 存储权限:ohos.permission.WRITE_MEDIA
  4. 兼容性

    • 此方案适用于鸿蒙 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的音频焦点机制来监听电话打断事件。建议采用以下方案:

  1. 对于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(); // 暂停录制
  }
});
  1. 关键参数说明:
  • INTERRUPT_FORCE表示强制中断(如来电)
  • 事件触发后应立即暂停AVRecorder
  • 可通过interruptEvent.hintType判断具体中断类型
  1. 录制恢复处理:
audioManager.on('audioInterrupt', (interruptEvent) => {
  if (interruptEvent.hintType === audio.InterruptHint.INTERRUPT_HINT_RESUME) {
    avRecorder.resume(); // 恢复录制
  }
});

注意要在应用退出时取消监听:

audioManager.off('audioInterrupt');
回到顶部