文档管理中心

实现后台录音

从API version 9开始,支持后台长时任务开发功能。应用配置后台长时任务可以支持应用后台录音。

后台录音是指应用在前台启动录音任务后,退至后台仍持续采集音频的场景。典型场景包括会议记录、语音备忘、采访录音等需要长时间录制的业务。

后台录音涉及麦克风采集和后台运行。应用需要同时满足麦克风权限、录音能力实现、后台长时任务声明和系统管控要求,不应在用户无感知或未授权的情况下启动录音。

约束与限制

  • 用户授权:录音前必须获得麦克风权限。用户撤销权限后,应用应立即停止录音并释放资源。
  • 用户可感知:后台录音期间应保持明确的用户感知方式。例如展示正在录音的通知、状态提示。
  • 场景匹配:后台模式声明应与真实业务一致。应用申请录音类型长时任务后,需要实际执行录音业务。仅存在播放、播控或媒体会话控制诉求时,不需要声明后台录音模式。
  • 最小化采集:应用只在用户触发录音任务期间采集音频,任务结束后及时停止,避免长期占用麦克风。
  • 资源释放:应用进入后台、应用退出、应用崩溃或录音完成后,必须要确保录音器、文件句柄和后台任务状态一致,避免出现录音已停止但后台任务仍存在的情况。
  • 隐私合规:不应在后台自动上传用户未确认的录音内容,录音文件的保存、上传、分享和删除应遵循用户授权。

开发步骤

应用实现录音功能的具体内容请参考使用AudioCapturer开发音频录制功能(ArkTS)、推荐使用OHAudio开发音频录制功能(C/C++)或使用AVRecorder录制音频(ArkTS)。当应用需要退至后台持续录音时,还需要申请录音类型的长时任务(ArkTS)。

  1. 声明后台录音模式。

    在module.json5配置文件中,为需要执行后台录音的UIAbility声明audioRecording后台模式。

    收起
    自动换行
    深色代码主题
    复制
    1. {
    2. "abilities": [
    3. {
    4. "name": "EntryAbility",
    5. "backgroundModes": [
    6. "audioRecording"
    7. ]
    8. }
    9. ]
    10. }
  2. 启动录音任务。

    应用需要在前台启动录音任务,启动后可以退至后台继续录音。在后台直接启动录音会失败。

    录音开始前,应用需要确认用户已经明确触发录音操作,并处理麦克风权限未授权、设备被占用、存储路径不可用等异常场景。录音开发方式请参考音频录制开发概述。

    针对应用在后台录音被其他音频流打断后无法恢复的场景,推荐使用以下解决方案:

    • 应用录音在后台被打断,收到焦点恢复通知时出现start失败,可以弹窗提醒用户再次打开应用手动重新开始录音。
    • 使用音频录制接口setIndependentAudioSessionStrategy,AudioSessionBehaviorFlags使用MUTE_WHEN_INTERRUPTED,录音流焦点策略被设置成静音打断模式,被其他应用打断导致停止或暂停录制时会进入静音录制状态,在此状态下录制的音频没有声音,其他应用录制动作完成后恢复录制有声数据。
  3. 申请录音类型长时任务。

    当录音需要退至后台持续运行时,应用需要申请AUDIO_RECORDING类型长时任务,使系统识别该后台任务与录音业务匹配。

    收起
    自动换行
    深色代码主题
    复制
    1. import { BusinessError } from '@kit.BasicServicesKit';
    2. import { backgroundTaskManager } from '@kit.BackgroundTasksKit'
    3. import { wantAgent, WantAgent } from '@kit.AbilityKit'
    4. // ...
    5. // 开启长时任务。
    6. startContinuousTask(context: Context) {
    7. let wantAgentInfo: wantAgent.WantAgentInfo = {
    8. // 点击通知后,将要执行的动作列表。
    9. // 添加需要被拉起应用的bundleName和abilityName。
    10. wants: [
    11. {
    12. bundleName: 'com.example.backgroundmusic',
    13. abilityName: 'MainAbility'
    14. }
    15. ],
    16. // 指定点击通知栏消息后的动作是拉起ability。
    17. actionType: wantAgent.OperationType.START_ABILITY,
    18. // 使用者自定义的一个私有值。
    19. requestCode: 0,
    20. // 点击通知后,动作执行属性。
    21. actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG],
    22. };
    23. try {
    24. // 通过wantAgent模块下getWantAgent方法获取WantAgent对象。
    25. wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj: WantAgent) => {
    26. try {
    27. let list: string[] = ['audioPlayback', 'audioRecording'];
    28. backgroundTaskManager.startBackgroundRunning(context, list, wantAgentObj)
    29. .then(() => {
    30. console.info('Operate startBackgroundRunning succeeded');
    31. })
    32. .catch((error: BusinessError) => {
    33. console.error(`Failed to operate startBackgroundRunning. code is ${error.code} message is ${error.message}`);
    34. });
    35. } catch (error) {
    36. console.error(`Failed to operate startBackgroundRunning. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`);
    37. };
    38. });
    39. } catch (error) {
    40. console.error(`Failed to operate getWantAgent. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`);
    41. }
    42. }

    长时任务启动失败时,应用需避免继续以后台录音方式运行,应停止录音或引导用户回到前台处理。长时任务的完整申请和取消流程请参考长时任务(ArkTS)。

  4. 停止录音并释放资源。

    用户停止录音、录音异常中断或业务结束时,应用需要调用AudioCapturer的release接口停止录音、释放音频采集资源,并同步取消录音类型长时任务。

    收起
    自动换行
    深色代码主题
    复制
    1. // 取消长时任务。
    2. stopContinuousTask(context: Context) {
    3. backgroundTaskManager.stopBackgroundRunning(context).then(() => {
    4. console.info(`Succeeded in operating stopBackgroundRunning.`);
    5. }).catch((err: BusinessError) => {
    6. console.error(`Failed to operate stopBackgroundRunning. Code is ${err.code}, message is ${err.message}`);
    7. });
    8. }