# record-manage **Repository Path**: Fie_Ryan/record-manage ## Basic Information - **Project Name**: record-manage - **Description**: AVRecorderManage 是一个基于 HarmonyOS 开发的音视频录制管理库,采用单例模式设计,提供完整的音频录制生命周期管理能力。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://gitee.com/Fie_Ryan - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-05-26 - **Last Updated**: 2026-05-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: 音视频录制, HarmonyOS, AVRecorder, 录音录屏, ArkTS ## README # AVRecorderManage 音视频录制库文档 --- ## 一、库概述 `AVRecorderManage` 是一个基于 **HarmonyOS** 开发的音视频录制管理库,采用**单例模式**设计,提供完整的音频录制生命周期管理能力。 ### 1.1 核心特点 | 特性 | 说明 | |-----|------| | **单例模式** | 全局唯一实例,避免资源浪费和状态混乱 | | **状态管理** | 完整的录制状态机,支持状态监听与回调 | | **生命周期管理** | 初始化、启动、暂停、恢复、停止、释放全流程控制 | | **默认配置** | 内置音频/视频默认配置,开箱即用 | | **扩展性强** | 支持自定义编码参数、输出路径和文件格式 | | **错误处理** | 完善的异常捕获和错误回调机制 | | **日志系统** | 可配置的日志输出模式,便于调试和生产环境切换 | ### 1.2 功能状态 | 功能模块 | 状态 | 说明 | |---------|------|------| | ✅ **音频录制** | 已实现 | 完整支持麦克风录音、暂停、恢复、停止 | | ⏳ **视频录制** | 待开发 | 框架已预留,相机流和视频编码待实现 | | ⏳ **文件导出** | 待开发 | 导出到系统相册、分享功能 | | ⏳ **录制时长限制** | 待开发 | 支持配置最大录制时长自动停止 | ### 1.3 技术栈 - **框架**: HarmonyOS ArkUI (TypeScript) - **核心能力**: MediaKit、AudioKit、CameraKit(预留) - **文件系统**: @ohos.file.fs --- ## 二、项目结构 ``` library/ ├── src/main/ets/ │ ├── AVRecorderManage.ets # 核心管理器(单例) │ ├── constants/ │ │ └── LoggerMode.ets # 日志模式常量定义 │ ├── model/ │ │ └── AVRecorderModel.ets # 默认配置模型(音频/视频参数) │ ├── type/ │ │ ├── AVRecorder.type.ets # 录制状态类型定义 │ │ ├── AVRecorderListener.ets # 监听器回调接口 │ │ ├── AVRecorderOptions.ets # 初始化配置选项类型 │ │ └── File.type.ets # 文件操作相关类型 │ └── utils/ │ ├── FileUtil.ets # 文件操作工具类 │ ├── Log.ets # 日志工具类 │ └── RandomUtil.ets # 随机字符串生成工具 ├── src/ohosTest/ # 鸿蒙单元测试 ├── src/test/ # 本地单元测试 ├── Index.ets # 库导出入口(所有对外API) ├── BuildProfile.ets # 构建配置 ├── CHANGELOG.md # 版本变更记录 ├── LICENSE # 许可证 ├── README.md # 项目说明 ├── build-profile.json5 # 构建配置 ├── consumer-rules.txt # 消费者规则 ├── hvigorfile.ts # 构建脚本 ├── obfuscation-rules.txt # 混淆规则 └── oh-package.json5 # 包依赖配置 ``` ### 2.1 文件职责说明 | 文件路径 | 职责描述 | |---------|---------| | `AVRecorderManage.ets` | 核心管理器,单例模式,管理录制全生命周期 | | `LoggerMode.ets` | 定义日志模式枚举(开发/生产) | | `AVRecorderModel.ets` | 音视频默认配置参数(编码、比特率、采样率等) | | `AVRecorder.type.ets` | 录制状态类型和状态枚举定义 | | `AVRecorderListener.ets` | 状态监听回调接口定义 | | `AVRecorderOptions.ets` | 初始化配置选项类型定义 | | `FileUtil.ets` | 文件操作工具(打开、关闭、读写、删除) | | `Log.ets` | 日志工具类,封装 hilog | | `RandomUtil.ets` | 随机文件名生成工具 | | `Index.ets` | 统一导出入口,聚合所有公开API | --- ## 三、快速开始 ### 3.1 安装依赖 在项目的 `oh-package.json5` 中添加本地依赖: ```json { "name": "@ohos/your-app", "version": "1.0.0", "dependencies": { "@ryan/record-manage": "v1.0.0" } } ``` 然后执行依赖安装: ```bash ohpm install ``` 或者在项目的根目录执行以下命令: ```bash ohpm install @ryan/record-manage ``` ### 3.2 基础使用示例 ```typescript import { AVRecorderManage, AVRecorderOptions, AVRecorderListener, LoggerMode } from '@ryan/record-manage'; // 1. 设置日志模式(可选,默认开发模式) AVRecorderManage.setLogMode(LoggerMode.DEVELOPMENT); // 2. 创建状态监听回调 const listener: AVRecorderListener = { prepared: () => { console.log('✅ 录制器准备完成,可开始录制'); }, running: () => { console.log('🎙️ 正在录制...'); }, paused: () => { console.log('⏸️ 录制已暂停'); }, stopped: () => { console.log('⏹️ 录制已停止'); }, saved: () => { const filePath = AVRecorderManage.getSaveFileUrl(); console.log(`📁 文件已保存: ${filePath}`); }, release: () => { console.log('🔌 资源已释放'); }, error: (err) => { console.error(`❌ 录制错误: ${err.code} - ${err.message}`); } }; // 3. 初始化录制器(音频模式) const options: AVRecorderOptions = { recordType: 'audio', // 录制类型:audio | video listener: listener, // 状态回调 recordFileType: 'mp3' // 输出格式:mp3 | wav | mp4 }; try { await AVRecorderManage.initAVRecorderManage(this.context, options); // 4. 开始录制 await AVRecorderManage.startedAudioRecord(); // 5. 模拟录制3秒后暂停 setTimeout(async () => { await AVRecorderManage.pausedAudioRecord(); // 6. 1秒后恢复录制 setTimeout(async () => { await AVRecorderManage.resumedAudioRecord(); // 7. 2秒后停止录制 setTimeout(async () => { await AVRecorderManage.stoppedAudioRecord(); // 8. 释放资源 await AVRecorderManage.release(); }, 2000); }, 1000); }, 3000); } catch (error) { console.error('初始化失败:', error); } ``` --- ## 四、API 文档 ### 4.1 核心方法 | 方法名 | 功能描述 | 参数 | 返回值 | |-------|---------|------|--------| | `getInstance()` | **[内部]** 获取单例实例 | 无 | `AVRecorderManage` | | `initAVRecorderManage(context, options)` | **初始化录制器**,创建系统录音实例并配置参数 | `context`: 应用上下文(必需)
`options`: 配置项(必需) | `Promise` | | `setLogMode(mode)` | 设置日志输出模式 | `mode`: `LoggerMode.DEVELOPMENT` \| `LoggerMode.PRODUCTION` | `void` | | `getCurrentState()` | 获取当前录制状态 | 无 | `AVRecorderState` | | `getSaveFileUrl()` | 获取录制文件保存路径(fd://格式) | 无 | `string` | | `startedAudioRecord()` | **开始音频录制** | 无 | `Promise` | | `pausedAudioRecord()` | **暂停音频录制** | 无 | `Promise` | | `resumedAudioRecord()` | **恢复音频录制** | 无 | `Promise` | | `stoppedAudioRecord()` | **停止音频录制** | 无 | `Promise` | | `reset()` | **重置录制器**,恢复到IDLE状态 | 无 | `Promise` | | `release()` | **释放所有资源**(必须调用) | 无 | `Promise` | | `exportFile()` | **导出录制文件** | 无 | `Promise` | | `startedVideoRecord()` | **[预留]** 开始视频录制 | 无 | `Promise` | | `stoppedVideoRecord()` | **[预留]** 停止视频录制 | 无 | `Promise` | ### 4.2 状态约束说明 | 方法 | 允许调用的状态 | 调用后状态 | |-----|---------------|-----------| | `initAVRecorderManage()` | 仅 `IDLE` | `PREPARED` | | `startedAudioRecord()` | `PREPARED`, `SAVED`, `PAUSED`, `STOPPED` | `STARTED` → `RUNNING` | | `pausedAudioRecord()` | `STARTED`, `RUNNING` | `PAUSED` | | `resumedAudioRecord()` | `PAUSED` | `RUNNING` | | `stoppedAudioRecord()` | `STARTED`, `RUNNING`, `PAUSED` | `STOPPED` → `SAVED` | | `reset()` | 任意状态 | `RESET` → `IDLE` | | `release()` | 任意状态 | `RELEASED` | > **注意**: 调用方法时如果当前状态不符合约束,方法会记录警告日志并直接返回,不会抛出异常。 ### 4.3 方法详细说明 #### 4.3.1 initAVRecorderManage **功能**: 初始化录制器,完成系统资源分配和参数配置 **参数详解**: - `context`: 应用上下文,必须是 `common.Context` 类型,用于获取应用沙箱目录和权限 - `options`: 初始化配置项,详见 [5.1 AVRecorderOptions](#51-avrecorderoptions) **内部执行流程**: 1. 校验上下文有效性 2. 创建系统 `media.AVRecorder` 实例 3. 注册状态监听回调 4. 初始化音频/视频编码参数 5. 生成随机文件路径并打开文件句柄 6. 调用 `prepare()` 进入 PREPARED 状态 **示例**: ```typescript await AVRecorderManage.initAVRecorderManage(this.context, { recordType: 'audio', listener: myListener, recordFileType: 'mp3', avProfile: { audioBitrate: 128000, // 自定义比特率 audioChannels: 2, // 立体声 audioCodec: media.CodecMimeType.AUDIO_AAC } }); ``` #### 4.3.2 startedAudioRecord **功能**: 开始音频录制 **状态约束**: 必须在 `PREPARED`, `SAVED`, `PAUSED`, `STOPPED` 状态调用 **内部执行流程**: 1. 校验当前状态是否允许启动 2. 调用系统 `avRecorder.start()` 3. 更新状态为 `STARTED` → `RUNNING` 4. 触发 `started` 和 `running` 回调 #### 4.3.3 stoppedAudioRecord **功能**: 停止音频录制并保存文件 **状态约束**: 必须在 `STARTED`, `RUNNING`, `PAUSED` 状态调用 **内部执行流程**: 1. 校验当前状态是否允许停止 2. 调用系统 `avRecorder.stop()` 3. 更新状态为 `STOPPED` → `SAVED` 4. 安全关闭文件句柄 5. 触发 `stopped` 和 `saved` 回调 #### 4.3.4 release **功能**: 释放所有资源,防止内存泄漏 **内部执行流程**: 1. 注销所有事件监听器 2. 调用系统 `avRecorder.release()` 3. 释放视频输出流(如存在) 4. 安全关闭文件句柄 5. 更新状态为 `RELEASED` 6. 触发 `release` 回调 > **重要**: 录制完成后**必须**调用此方法释放资源! --- ## 五、类型定义 ### 5.1 AVRecorderOptions(初始化配置) ```typescript interface AVRecorderOptions { /** * 录制类型 * @description audio: 音频录制(已实现), video: 视频录制(待开发) * @required 必需参数 */ recordType: 'audio' | 'video'; /** * 状态监听回调 * @description 监听录制生命周期的各个状态变化 */ listener?: AVRecorderListener; /** * 音视频编码配置 * @description 自定义比特率、声道数、采样率、编码格式等 */ avProfile?: media.AVRecorderProfile; /** * 录制器基础配置 * @description 音源类型、输出路径、文件生成模式等 */ avConfig?: media.AVRecorderConfig; /** * 输出文件格式 * @description mp3: 音频MP3格式, wav: 无损音频格式, mp4: 视频格式 * @default audio模式默认'mp3', video模式默认'mp4' */ recordFileType?: 'mp3' | 'wav' | 'mp4'; /** * 自定义保存路径 * @description 完整的应用沙箱路径,如 `${context.cacheDir}/my_recording.mp3` * @default 自动生成随机路径: `${cacheDir}/{random}.{ext}` */ saveFileUrl?: string; } ``` ### 5.2 AVRecorderListener(状态监听) ```typescript interface AVRecorderListener { /** 空闲状态:录制器已创建/已重置,等待准备 */ idle?: () => void; /** 准备完成:参数配置完毕,可开始录制 */ prepared?: () => void; /** 已启动:录制开始触发,仅执行一次 */ started?: () => void; /** 录制中:正在持续采集音频数据 */ running?: () => void; /** 已暂停:暂停采集,可通过resume恢复 */ paused?: () => void; /** 已停止:完全停止采集,等待保存或重置 */ stopped?: () => void; /** 文件已保存:音频数据已写入存储 */ saved?: () => void; /** 资源已释放:录制器销毁,不可再使用 */ release?: () => void; /** 已重置:恢复到初始空闲状态 */ reset?: () => void; /** 已恢复:从暂停状态恢复到录制中 */ resume?: () => void; /** * 错误回调:录制过程中发生异常 * @param error 业务错误对象,包含错误码和错误信息 */ error?: (error: BusinessError) => void; } ``` ### 5.3 AVRecorderStateEnum(状态枚举) | 状态值 | 字符串表示 | 说明 | |-------|-----------|------| | `IDLE` | `'idle'` | 空闲状态:录制器已创建但未准备,或已重置 | | `PREPARED` | `'prepared'` | 准备完成:参数配置完毕,等待启动录制 | | `STARTED` | `'started'` | 已启动:录制刚刚开始,仅短暂停留 | | `RUNNING` | `'running'` | 录制中:正在持续采集音频数据 | | `PAUSED` | `'paused'` | 已暂停:暂停采集,可恢复 | | `STOPPED` | `'stopped'` | 已停止:完全停止采集,等待保存 | | `SAVED` | `'saved'` | 已保存:文件已写入存储 | | `RESET` | `'reset'` | 已重置:恢复到初始状态 | | `RELEASED` | `'released'` | 已释放:资源已销毁,不可再使用 | | `ERROR` | `'error'` | 错误状态:发生异常错误 | ### 5.4 RecorderFileType(文件格式类型) ```typescript type RecorderFileType = "mp3" | "wav" | "mp4"; ``` | 格式 | 适用场景 | 特点 | |-----|---------|------| | `mp3` | 音频录制 | 压缩率高,文件小,兼容性好 | | `wav` | 无损音频 | 无压缩,音质好,文件大 | | `mp4` | 视频录制 | 音视频封装,兼容性强 | --- ## 六、默认配置参数 ### 6.1 音频默认配置 ```typescript // 音频编码配置 DEFAULT_AVDIO_PROFILE = { audioBitrate: 112000, // 比特率:112kbps(保证音质清晰) audioChannels: 2, // 声道数:2(立体声) audioCodec: AUDIO_AAC, // 编码格式:AAC(标准编码,兼容性最好) audioSampleRate: 48000, // 采样率:48kHz(高保真音质) fileFormat: CFT_MPEG_4A // 文件格式:M4A(音频专用,体积小) }; // 音频录制配置 DEFAULT_AVDIO_CONFIG = { audioSourceType: AUDIO_SOURCE_TYPE_MIC, // 音源:麦克风 profile: DEFAULT_AVDIO_PROFILE, url: '' // 输出路径(动态生成) }; ``` ### 6.2 视频默认配置(预留) ```typescript // 视频编码配置 DEFAULT_VIDEO_PROFILE = { fileFormat: CFT_MPEG_4, // 文件格式:MP4(通用标准) videoBitrate: 200000, // 比特率:200kbps videoCodec: VIDEO_AVC, // 编码格式:H.264(硬件编码支持最好) videoFrameWidth: 640, // 宽度:640px videoFrameHeight: 480, // 高度:480px videoFrameRate: 30 // 帧率:30fps }; // 视频录制配置 DEFAULT_VIDEO_CONFIG = { videoSourceType: VIDEO_SOURCE_TYPE_SURFACE_YUV, // 视频源类型 audioSourceType: AUDIO_SOURCE_TYPE_MIC, // 音频源:麦克风 profile: DEFAULT_VIDEO_PROFILE, url: '' // 输出路径(动态生成) }; ``` ### 6.3 通用配置 ```typescript // 通用编码配置(音视频共用) COMMON_RECORD_PROFILE = { fileFormat: CFT_MPEG_4, // MP4格式 isHdr: false, // 关闭HDR enableTemporalScale: false,// 关闭时域缩放 enableBFrame: false // 关闭B帧编码 }; // 通用录制配置 COMMON_RECORD_CONFIG = { fileGenerationMode: AUTO_CREATE_CAMERA_SCENE, // 相机场景自动创建 rotation: 0, // 画面不旋转 location: { latitude: 0, longitude: 0 }, // 不记录位置 metadata: { videoOrientation: '0' }, // 元数据 maxDuration: 0, // 不限制时长 profile: COMMON_RECORD_PROFILE, url: "" }; ``` --- ## 七、状态流转图 ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ 录制器状态流转 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ IDLE ──init()──> PREPARED ──start()──> STARTED ──running──> RUNNING │ │ ^ │ │ │ │ │ │ └──pause()──> PAUSED │ │ │ │ │ │ │ │ │ └──resume()──┘ │ │ │ │ │ │ reset()<── STOPPED <──stop()<───────────────────────────────────────────────│ │ │ │ │ │ │ └──saved()──> SAVED ──start()──┐ │ │ │ │ │ │ └────────────────────────────────────────┘ │ │ │ │ [任何状态] ──release()──> RELEASED (资源销毁,不可再用) │ │ │ │ [任何状态] ──error()──> ERROR (异常状态,需reset或release) │ │ │ └─────────────────────────────────────────────────────────────────────────────┘ ``` ### 状态转换规则 | 转换方向 | 触发条件 | 说明 | |---------|---------|------| | IDLE → PREPARED | `initAVRecorderManage()` | 初始化成功 | | PREPARED → STARTED | `startedAudioRecord()` | 开始录制 | | STARTED → RUNNING | 系统状态回调 | 录制进入稳定状态 | | RUNNING / STARTED → PAUSED | `pausedAudioRecord()` | 暂停录制 | | PAUSED → RUNNING | `resumedAudioRecord()` | 恢复录制 | | RUNNING / PAUSED / STARTED → STOPPED | `stoppedAudioRecord()` | 停止录制 | | STOPPED → SAVED | 内部自动转换 | 文件保存完成 | | SAVED → STARTED | `startedAudioRecord()` | 继续录制(新文件) | | SAVED / STOPPED → IDLE | `reset()` | 重置到初始状态 | | 任意 → RELEASED | `release()` | 释放资源 | | 任意 → ERROR | 发生异常 | 错误状态 | --- ## 八、工具类详解 ### 8.1 Log(日志工具) **功能**: 封装 HarmonyOS `hilog`,提供统一的日志管理能力 **特性**: - 支持开发/生产模式切换 - 支持日志级别:debug、info、warn、error - 支持标签(TAG)和参数格式化 - 单例模式,全局唯一实例 **方法说明**: | 方法 | 功能 | 参数 | |-----|------|------| | `debug(message, tag?, ...args)` | 调试日志(仅开发模式) | `message`: 日志内容
`tag`: 模块标签
`args`: 可变参数 | | `info(message, tag?, ...args)` | 信息日志(仅开发模式) | 同上 | | `warn(message, tag?, ...args)` | 警告日志(仅开发模式) | 同上 | | `error(message, tag?, error?, ...args)` | 错误日志(始终输出) | `error`: 可选错误对象 | | `setLoggerMode(mode)` | 设置日志模式 | `mode`: LoggerMode | **使用示例**: ```typescript import { LogUtils } from '@ryan/record-manage'; LogUtils.debug('初始化参数', 'AVRecorder', { option: 'value' }); LogUtils.info('录制开始', 'AudioManager'); LogUtils.warn('状态异常', 'StateMachine'); LogUtils.error('文件写入失败', 'FileUtil', new Error('磁盘空间不足')); ``` ### 8.2 FileUtil(文件工具) **功能**: 封装 `@ohos.file.fs`,提供便捷的文件操作能力 **方法说明**: | 方法 | 功能 | 参数 | 返回值 | |-----|------|------|--------| | `getFdPath(filePath)` | 添加 fd:// 前缀 | `filePath`: 原始路径 | `string` | | `open(path, mode)` | 异步打开文件 | `path`: 文件路径
`mode`: 打开模式 | `Promise` | | `openSync(path, mode)` | 同步打开文件 | 同上 | `fs.File` | | `checkExists(path, mode)` | 检查文件/目录是否存在 | `path`: 路径
`mode`: 检查模式 | `Promise` | | `createFolder(path)` | 创建目录 | `path`: 目录路径 | `Promise` | | `createFile(path)` | 创建文件 | `path`: 文件路径 | `Promise` | | `close(file)` | 关闭文件句柄 | `file`: 文件对象 | `Promise` | | `write(file, buffer, option)` | 异步写入文件 | `file`: 文件对象
`buffer`: 数据
`option`: 写入选项 | `Promise` | | `writeSync(file, buffer, option)` | 同步写入文件 | 同上 | `number` | | `read(file, buffer, option)` | 异步读取文件 | `file`: 文件对象
`buffer`: 数据缓冲区
`option`: 读取选项 | `Promise` | | `readSync(file, buffer, option)` | 同步读取文件 | 同上 | `number` | | `deleteFile(path)` | 删除文件 | `path`: 文件路径 | `Promise` | **CreateStatus 枚举**: | 值 | 说明 | |-----|------| | `Success` | 创建成功 | | `Exists` | 已存在 | | `Fail` | 创建失败 | ### 8.3 RandomUtil(随机工具) **功能**: 生成随机字符串,用于生成唯一文件名 **方法说明**: | 方法 | 功能 | 参数 | 返回值 | |-----|------|------|--------| | `generateRandomFilename(length, ext)` | 生成随机文件名 | `length`: 文件名长度(默认8)
`ext`: 文件扩展名 | `string` | **使用示例**: ```typescript import { RandomUtil } from '@ryan/record-manage'; // 生成20位随机文件名,带mp3扩展名 const filename = RandomUtil.generateRandomFilename(20, 'mp3'); // 输出示例: 'aB3kLm7pQr9sT1uV2wX4y6.mp3' ``` --- ## 九、高级用法 ### 9.1 自定义编码参数 ```typescript import { media } from '@kit.MediaKit'; const options: AVRecorderOptions = { recordType: 'audio', avProfile: { audioBitrate: 192000, // 更高比特率,更好音质 audioChannels: 2, // 立体声 audioCodec: media.CodecMimeType.AUDIO_AAC, audioSampleRate: 48000, // 48kHz采样率 fileFormat: media.ContainerFormatType.CFT_MPEG_4A }, avConfig: { audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, maxDuration: 600000 // 最大录制时长10分钟 } }; await AVRecorderManage.initAVRecorderManage(this.context, options); ``` ### 9.2 自定义保存路径 ```typescript const customPath = `${this.context.filesDir}/recordings/my_audio.mp3`; const options: AVRecorderOptions = { recordType: 'audio', recordFileType: 'mp3', avConfig: { url: customPath // 使用自定义路径 } }; await AVRecorderManage.initAVRecorderManage(this.context, options); ``` ### 9.3 状态轮询检测 ```typescript // 轮询检测录制状态 const checkRecordingState = async () => { const state = AVRecorderManage.getCurrentState(); switch (state) { case 'idle': console.log('等待初始化'); break; case 'prepared': await AVRecorderManage.startedAudioRecord(); break; case 'running': console.log('录制中...'); break; case 'saved': const path = AVRecorderManage.getSaveFileUrl(); console.log(`录制完成: ${path}`); break; default: console.log(`当前状态: ${state}`); } }; // 每秒检测一次 setInterval(checkRecordingState, 1000); ``` ### 9.4 错误处理最佳实践 ```typescript try { await AVRecorderManage.initAVRecorderManage(this.context, options); await AVRecorderManage.startedAudioRecord(); // 录制逻辑... } catch (error) { console.error('录制异常:', error); // 错误处理策略 const state = AVRecorderManage.getCurrentState(); if (state !== 'released') { await AVRecorderManage.release(); } // 通知用户 prompt.showToast({ message: '录制失败,请重试' }); } ``` --- ## 十、权限配置 在 `module.json5` 中声明必要权限: ```json { "module": { "reqPermissions": [ { "name": "ohos.permission.MICROPHONE", "reason": "需要使用麦克风进行录音", "usedScene": { "abilities": ["YourAbility"], "when": "inuse" } }, { "name": "ohos.permission.WRITE_MEDIA", "reason": "需要保存录音文件到媒体库", "usedScene": { "abilities": ["YourAbility"], "when": "inuse" } }, { "name": "ohos.permission.READ_MEDIA", "reason": "需要读取录音文件", "usedScene": { "abilities": ["YourAbility"], "when": "inuse" } } ] } } ``` **权限说明**: | 权限 | 用途 | |-----|------| | `ohos.permission.MICROPHONE` | 访问麦克风进行录音 | | `ohos.permission.WRITE_MEDIA` | 写入媒体文件 | | `ohos.permission.READ_MEDIA` | 读取媒体文件 | --- ## 十一、注意事项 ### 11.1 资源管理 ```typescript // ❌ 错误:忘记释放资源 await AVRecorderManage.initAVRecorderManage(context, options); await AVRecorderManage.startedAudioRecord(); await AVRecorderManage.stoppedAudioRecord(); // 资源泄漏! // ✅ 正确:使用完毕后释放资源 await AVRecorderManage.initAVRecorderManage(context, options); try { await AVRecorderManage.startedAudioRecord(); // 录制... await AVRecorderManage.stoppedAudioRecord(); } finally { await AVRecorderManage.release(); // 必须调用 } ``` ### 11.2 状态校验 ```typescript // 在调用方法前检查状态 const state = AVRecorderManage.getCurrentState(); if (state === 'prepared') { await AVRecorderManage.startedAudioRecord(); } else { console.warn(`当前状态不允许开始录制: ${state}`); } ``` ### 11.3 文件路径处理 ```typescript // 使用应用沙箱路径,不要使用绝对路径 const validPath = `${this.context.cacheDir}/recording.mp3`; // ✅ const invalidPath = '/sdcard/recording.mp3'; // ❌ 无权限 ``` ### 11.4 异步操作顺序 ```typescript // 异步操作需要按顺序执行 await AVRecorderManage.initAVRecorderManage(context, options); await AVRecorderManage.startedAudioRecord(); // 必须等初始化完成 // 错误示例:没有等待初始化完成 AVRecorderManage.initAVRecorderManage(context, options); await AVRecorderManage.startedAudioRecord(); // 可能失败 ``` --- ## 十二、代码示例汇总 ### 完整音频录制示例 ```typescript import { AVRecorderManage, AVRecorderOptions, AVRecorderListener, LoggerMode, AVRecorderStateEnum } from '@ohos/av-recorder'; class RecordingService { private isRecording = false; async startRecording(context: common.Context): Promise { if (this.isRecording) return; const listener: AVRecorderListener = { prepared: () => console.log('准备完成'), running: () => { this.isRecording = true; console.log('开始录制'); }, paused: () => console.log('已暂停'), stopped: () => console.log('已停止'), saved: () => { const path = AVRecorderManage.getSaveFileUrl(); console.log(`文件保存路径: ${path}`); }, error: (err) => console.error(`错误: ${err.message}`) }; const options: AVRecorderOptions = { recordType: 'audio', listener: listener, recordFileType: 'mp3' }; try { await AVRecorderManage.initAVRecorderManage(context, options); await AVRecorderManage.startedAudioRecord(); } catch (error) { console.error('录制启动失败:', error); } } async stopRecording(): Promise { if (!this.isRecording) return; try { await AVRecorderManage.stoppedAudioRecord(); this.isRecording = false; } finally { await AVRecorderManage.release(); } } async pauseRecording(): Promise { await AVRecorderManage.pausedAudioRecord(); } async resumeRecording(): Promise { await AVRecorderManage.resumedAudioRecord(); } } // 使用方式 const service = new RecordingService(); await service.startRecording(this.context); ``` ---