HarmonyOS鸿蒙Next中屏幕录制回到主页时,10s内应用会被系统杀死
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
针对这种提情况,尝试方案:
-
无效果:长时间任务,通过 backgroundTaskManager.startBackgroundRunning(context, [‘multiDeviceConnection’, ‘audioRecording’, ‘audioPlayback’], wantAgentObj)
-
可行:在1的基础上,OH_AVScreenCaptureConfig 不设置audioInfo
按照这个设置,那么回到桌面主页,就无法录制音频,请问是否有可以支持回退到主页时,应用可正常录制音频的方案
更多关于HarmonyOS鸿蒙Next中屏幕录制回到主页时,10s内应用会被系统杀死的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
可以声明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或前台服务,来延长应用在后台的运行时间,从而避免被系统强制终止。