HarmonyOS鸿蒙Next中屏幕录制回到主页时,10s内应用会被系统杀死

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

HarmonyOS鸿蒙Next中屏幕录制回到主页时,10s内应用会被系统杀死 屏幕录制,home键回到主页后,应用会被杀死,查看日志

[audio_proc.cpp(CheckAudioCapturer):102] AudioCapturer cannot be used after being frozen. The system will kill the UID: 20020019. sourceType is 2, capturerFlags is 0

针对这种提情况,尝试方案:

  1. 无效果:长时间任务,通过 backgroundTaskManager.startBackgroundRunning(context, [‘multiDeviceConnection’, ‘audioRecording’, ‘audioPlayback’], wantAgentObj)

  2. 可行:在1的基础上,OH_AVScreenCaptureConfig 不设置audioInfo

按照这个设置,那么回到桌面主页,就无法录制音频,请问是否有可以支持回退到主页时,应用可正常录制音频的方案


更多关于HarmonyOS鸿蒙Next中屏幕录制回到主页时,10s内应用会被系统杀死的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

可以声明KEEP_BACKGROUND_RUNNING权限,允许Service Ability在后台持续运行,

EntryAbility.ets:

import { abilityAccessCtrl, AbilityConstant, common, Permissions, UIAbility, Want, WantAgent, wantAgent } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';
import { backgroundTaskManager } from '@kit.BackgroundTasksKit';

const permissions: Array<Permissions> = ['ohos.permission.MICROPHONE', 'ohos.permission.READ_MEDIA', 'ohos.permission.WRITE_MEDIA', 'ohos.permission.SYSTEM_FLOAT_WINDOW'];
// 使用UIExtensionAbility:将common.UIAbilityContext 替换为common.UIExtensionContext
function reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext): void {
  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
  atManager.requestPermissionsFromUser(context, permissions).then((data) => {
    let grantStatus: Array<number> = data.authResults;
    let length: number = grantStatus.length;
    for (let i = 0; i < length; i++) {
      if (grantStatus[i] === 0) {
        // 用户授权,可以继续访问目标操作
      } else {
        // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
        return;
      }
    }
    // 授权成功
  }).catch((err: BusinessError) => {
    console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
  })
}

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy(): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
    reqPermissionsFromUser(permissions, this.context);
    windowStage.loadContent('pages/Index', (err) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
    });
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
    let wantAgentInfo: wantAgent.WantAgentInfo = {
      // 点击通知后,将要执行的动作列表
      wants: [
        {
          bundleName: "com.example.myapplication",
          abilityName: "EntryAbility"
        }
      ],
      // 点击通知后,动作类型
      actionType: wantAgent.OperationType.START_ABILITY,
      // 使用者自定义的一个私有值
      requestCode: 0,
      // 点击通知后,动作执行属性
      wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
    };
    try {
      // 通过wantAgent模块下getWantAgent方法获取WantAgent对象
      wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj: WantAgent) => {
        try {
          backgroundTaskManager.startBackgroundRunning(this.context,
            backgroundTaskManager.BackgroundMode.AUDIO_RECORDING, wantAgentObj).then(() => {
            console.info("Operation startBackgroundRunning succeeded");
          }).catch((error: BusinessError) => {
            console.error(`Operation startBackgroundRunning failed. code is ${error.code} message is ${error.message}`);
          });
        } catch (error) {
          console.error(`Operation startBackgroundRunning failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`);
        }
      });
    } catch (error) {
      console.error(`Operation getWantAgent failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`);
    }
  }
};

更多关于HarmonyOS鸿蒙Next中屏幕录制回到主页时,10s内应用会被系统杀死的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,屏幕录制功能在用户返回主页时,系统会在10秒内终止录制应用。这是由于系统资源管理和后台应用策略的设计。鸿蒙系统为了优化资源使用和确保前台应用的流畅性,会对后台应用进行严格的管理。屏幕录制应用在用户返回主页后,会被视为后台应用,系统会根据资源分配策略在10秒内将其终止,以防止资源占用影响其他应用的运行。这种机制是鸿蒙系统设计的一部分,旨在提升整体系统性能和用户体验。

在HarmonyOS鸿蒙Next中,当屏幕录制应用回到主页时,系统会在10秒内终止该应用。这是为了优化系统资源,防止后台应用占用过多内存和CPU。开发者可以通过调整应用的生命周期管理策略,如使用后台任务管理API或前台服务,来延长应用在后台的运行时间,从而避免被系统强制终止。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!