已开启
本地摄像头关不掉 #11
程龙创建于  25 天前
程龙
程龙
25 天前 创建

demo中screensharing页面开启过一次摄像头后,每次再次进入页面,摄像头就直接开启,无法关闭,下面的stop preview 关了又立马自动开启了a0cdad938c0748ef91e3c5e977b8c195.txt

likedislike
xileilei
xileilei
10 天前 评论:

结论:问题存在,且是 OHOS 原生插件代码引入的;
修改方案

修改 1(必改):删除 OhosPlugin.ets:2586-2588 的强制重启逻辑:

handler.onLocalVideoStateChanged = (source: Constants.VideoSourceType, state: Constants.LocalVideoStreamState, reason: Constants.LocalVideoStreamReason) => {
console.info("agora_rtc_ng mEventHandler.onLocalVideoStateChanged: ...");
this.engineChannel?.invokeMethod("onLocalVideoStateChanged", {...});
// 删除以下 3 行
// if(source == 0 && state == 0 && reason == 0) {
// this.rtcEngine?.startPreview();
// }
};

▎ 推测原意是采集异常中断时自动恢复。若确需保留自恢复,条件应改为仅在异常时触发(如 state == FAILED(3) 或 state == STOPPED && reason != OK),且最好由 Dart 侧业务决定是否重启,而不是在原生回调里无差别拉起。

修改 2(必改):让 release() 真正释放引擎,OhosPlugin.ets:2471:

private release() {
this.map.clear();
RtcEngine.destroySync(); // SDK 提供的静态方法(e.d.ets:175),会停采集并销毁单例引擎
this.rtcEngine = undefined;
}

这样页面 dispose 后摄像头被系统释放,再次进入页面 RtcEngineEx.create() 是全新引擎,不会再出现「一进来就开着」。

开发者您好,经初步分析,问题已复现,我们会尽快解决发布

likedislike