You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Android使用ZXing.Net.Mobile授权相机权限后需重启才生效如何解决

你遇到的是ZXing.Net.Mobile在安卓平台的典型权限适配问题:页面初始化时ZXing扫描组件已加载,此时尚未获取相机权限导致组件初始化失败,后续授权完成后组件不会自动重新激活,因此必须重启应用才能正常运行。

解决步骤

  1. 移除XAML中静态声明的ZXingScannerView
    删除XAML代码里的<zxing:ZXingScannerView ... />这一行,改为后台代码动态创建扫描组件。

  2. 修改扫码页后台逻辑,先申请权限再初始化组件
    调整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;
        // 原有扫码结果处理逻辑
    }
}
  1. 检查安卓端基础配置
  • 确认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:15:03