使用ZXing CameraBarcodeReaderView识别条码后跳转页面抛COMException
问题解答
需要关闭扫描器,跳转页面时扫描器若仍在运行,会持续占用相机资源或执行UI相关操作,和页面导航时的Toolbar更新逻辑冲突,进而引发COMException。
具体操作步骤如下:
在条码检测回调中先停止扫描
在OnBarcodesDetected方法里,优先停止扫描器的检测逻辑,再执行页面导航。根据ZXing.Net.Mobile的版本,可通过以下两种方式实现:- 设置控件的
IsScanning属性为false:private async void OnBarcodesDetected(BarcodeReaderView sender, BarcodeDetectionEventArgs args) { // 立即停止扫描 sender.IsScanning = false; // 更新绑定的检测状态 IsDetectingInternal = false; // 短暂延迟确保资源释放(可选,视情况调整) await Task.Delay(100); // 执行页面跳转 await Navigation.PushAsync(new ResultPage(args.Result[0].Text)); } - 调用控件的
StopScanning()方法(部分ZXing版本支持):private async void OnBarcodesDetected(BarcodeReaderView sender, BarcodeDetectionEventArgs args) { sender.StopScanning(); IsDetectingInternal = false; await Task.Delay(100); await Navigation.PushAsync(new ResultPage(args.Result[0].Text)); }
- 设置控件的
确保操作在UI线程执行
若OnBarcodesDetected回调运行在后台线程,需切换到UI线程处理扫描停止和导航操作,避免跨线程UI冲突:private async void OnBarcodesDetected(BarcodeReaderView sender, BarcodeDetectionEventArgs args) { await MainThread.InvokeOnMainThreadAsync(async () => { sender.IsScanning = false; IsDetectingInternal = false; await Navigation.PushAsync(new ResultPage(args.Result[0].Text)); }); }页面离开时兜底停止扫描
可在MainPage的OnDisappearing方法中添加扫描停止逻辑,确保页面切换时资源完全释放:protected override void OnDisappearing() { base.OnDisappearing(); // 替换为你的CameraBarcodeReaderView实例名 barcodeReaderView.IsScanning = false; }
内容的提问来源于stack exchange,提问作者MPelletier
相关产品推荐
相关产品推荐

