Xamarin.Android使用ZXing.Net.Mobile授权相机权限后需重启才生效如何解决
你遇到的是ZXing.Net.Mobile在安卓平台的典型权限适配问题:页面初始化时ZXing扫描组件已加载,此时尚未获取相机权限导致组件初始化失败,后续授权完成后组件不会自动重新激活,因此必须重启应用才能正常运行。
解决步骤
移除XAML中静态声明的ZXingScannerView
删除XAML代码里的<zxing:ZXingScannerView ... />这一行,改为后台代码动态创建扫描组件。修改扫码页后台逻辑,先申请权限再初始化组件
调整CEUScanModalPage的代码如下:
public partial class CEUScanModalPage : ContentPage, INotifyPropertyChanged { private bool _isScanning; private ZXingScannerView _scanView; // 改为后台声明,不在XAML中创建 public CEUScanModalPage() { InitializeComponent(); IsScanning = false; BindingContext = this; Indicator.Start(); } public bool IsScanning { get { return _isScanning; } set { _isScanning = value; OnPropertyChanged(); } } private async void OnCloseButtonClicked(object sender, EventArgs args) { await Navigation.PopModalAsync(); } protected override async void OnAppearing() { base.OnAppearing(); // 先主动申请相机权限 var cameraPermission = await Permissions.CheckStatusAsync<Permissions.Camera>(); if (cameraPermission != PermissionStatus.Granted) { cameraPermission = await Permissions.RequestAsync<Permissions.Camera>(); } if (cameraPermission == PermissionStatus.Granted) { // 权限获取成功后再初始化扫描组件 if (_scanView == null) { _scanView = new ZXingScannerView { WidthRequest = 200, HeightRequest = 200 }; _scanView.SetBinding(ZXingScannerView.IsScanningProperty, new Binding(nameof(IsScanning))); _scanView.OnScanResult += Handle_OnScanResult; Grid.SetRow(_scanView, 0); Grid.SetRowSpan(_scanView, 2); ParentGrid.Children.Add(_scanView); LoadingIndicator.IsVisible = false; } IsScanning = true; } else { // 权限被拒绝的提示逻辑 await DisplayAlert("权限不足", "请授予相机权限后使用扫码功能", "确定"); await Navigation.PopModalAsync(); } } protected override void OnDisappearing() { base.OnDisappearing(); if (_scanView != null) { _scanView.OnScanResult -= Handle_OnScanResult; _scanView.IsAnalyzing = false; _scanView.IsScanning = false; ParentGrid.Children.Remove(_scanView); _scanView = null; } } public async void Handle_OnScanResult(Result result) { IsScanning = false; // 原有扫码结果处理逻辑 } }
- 检查安卓端基础配置
- 确认
AndroidManifest.xml中已添加相机权限声明:
<uses-permission android:name="android.permission.CAMERA" />
- 确认
MainActivity.cs的OnCreate方法中已初始化ZXing平台组件,代码位置在Xamarin.Forms.Init()之后、LoadApplication()之前:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); Xamarin.Forms.Init(savedInstanceState); // 添加这行初始化ZXing ZXing.Net.Mobile.Forms.Android.Platform.Init(); LoadApplication(new App()); }
你现有的OnRequestPermissionsResult逻辑无需修改,已经符合要求。
完成以上修改后,首次打开扫码页会先申请权限,权限通过后才会加载扫描组件,不会再出现授权后无画面的问题。
内容的提问来源于stack exchange,提问作者Chris Kooken
相关产品推荐
相关产品推荐

