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');