HarmonyOS鸿蒙Next中如何解决屏幕停止录制后,无法开始第二次录制的问题
HarmonyOS鸿蒙Next中如何解决屏幕停止录制后,无法开始第二次录制的问题
【问题现象】
为了等屏幕旋转完成后再设置视频流的宽高,在开始录制的时候进行init,但是只有首次能够初始化成功,第二次则会触发报错The operate Init failed due to not permit in current state.
,最终无法改变状态。
报错内容为:
Failed to init avScreenCaptureRecorder, error: The operate Init failed due to not permit in current state.
问题代码如下:
@Component
export struct ScreenRecordWrapper {
@State lastTime: number = 180 // 剩余时间,视频打卡默认三分钟
@State hasStart: boolean = false
private timer: number | null = null
private avScreenCaptureRecorder: media.AVScreenCaptureRecorder | undefined = undefined;
aboutToAppear(): void {
try {
this.createAVScreenCapture();
} catch (exception) {
console.error('Failed to obtain the default display object. Code: ' + JSON.stringify(exception));
}
}
createAVScreenCapture() {
media.createAVScreenCaptureRecorder().then((captureRecorder: media.AVScreenCaptureRecorder) => {
if (captureRecorder != null) {
this.avScreenCaptureRecorder = captureRecorder;
// 注册监听事件
this.avScreenCaptureRecorder.on('stateChange', (state: media.AVScreenCaptureStateCode) => {
switch (state) {
case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STARTED:
this.hasStart = !this.hasStart
this.timer = setInterval(() => {
if (this.lastTime > 0) {
this.lastTime = this.lastTime - 1
} else {
this.stopRecord()
}
}, 1000)
break;
}
})
}
})
}
async init() {
if (this.avScreenCaptureRecorder !== undefined) {
await this.avScreenCaptureRecorder.init(this.avCaptureConfig).then(() => {
console.info('Succeeded init avScreenCaptureRecorder');
}).catch((err: BusinessError) => {
console.info('Failed to init avScreenCaptureRecorder, error: ' + err.message);
})
}
}
}
【背景知识】
音视频录制参考链接:
【定位思路】
- 录制屏幕过程中通过stateChange监听用户操作,但是发现只有SCREENCAPTURE_STATE_STARTED能被startRecording触发,而stopRecording即使调用成功也不会触发任何状态改变。
- 由开发指南文档可知不支持停止录制后第二次设置create的对象。
【解决方案】
avScreenCaptureRecorder重新初始化后,media.createAVScreenCaptureRecorder改为同步操作,避免二次设置create对象。
修改方式如下:
async createAVScreenCapture() {
try {
let captureRecorder: media.AVScreenCaptureRecorder = await media.createAVScreenCaptureRecorder();
if (captureRecorder != null) {
this.avScreenCaptureRecorder = captureRecorder;
// 注册监听事件
this.avScreenCaptureRecorder.on('stateChange', (state: media.AVScreenCaptureStateCode) => {
switch (state) {
case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STARTED:
this.hasStart = !this.hasStart
this.timer = setInterval(() => {
if (this.lastTime > 0) {
this.lastTime = this.lastTime - 1
} else {
this.stopRecord()
}
}, 1000)
break;
}
})
}
} catch (error) {
console.log(error);
}
}
【总结】
avScreenCaptureRecorder不支持停止后第二次设置create的对象,需要重新初始化并将createAVScreenCaptureRecorder改为同步操作。
更多关于HarmonyOS鸿蒙Next中如何解决屏幕停止录制后,无法开始第二次录制的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS鸿蒙Next中如何解决屏幕停止录制后,无法开始第二次录制的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,屏幕停止录制后无法开始第二次录制的问题
在HarmonyOS鸿蒙Next中,屏幕停止录制后无法开始第二次录制的问题,通常与系统资源释放或录制状态未正确重置有关。
首先,确保在第一次录制结束后,调用stopScreenRecording()
方法,并监听onStop()
回调,确保录制资源已完全释放。
其次,检查是否在录制结束后未正确重置录制状态,导致系统认为录制仍在进行中。可以通过调用resetScreenRecording()
方法或重新初始化录制模块来重置状态。
此外,检查是否有其他应用或系统进程占用了录制资源,导致无法启动第二次录制。可以通过日志或调试工具排查资源占用情况。
如果问题仍未解决,建议检查系统版本是否为最新,并确认是否存在已知的录制相关Bug。