如何让ZxingScanner开始扫描?

how to make ZxingScanner start scanning?

我正在尝试在我的 Xamarin 表单中实施条形码扫描,但没有成功。
我可以让摄像头正常工作,但我没有在屏幕上看到红线,它只是拒绝扫描任何东西

我试过了。我可以通过我的相机看到,但没有出现红线。但是我可以打开和关闭手电筒

XAML代码:

<Button  BackgroundColor="Chocolate" Clicked="Button_Clicked"/>
<zxing:ZXingScannerView 
    x:Name="_scanView" 
    OnScanResult="Handle_OnScanResult" 
    IsScanning="true" 
    IsAnalyzing="true"
    WidthRequest="200" 
    HeightRequest="200" />

C#代码:

private void Button_Clicked(object sender, EventArgs e)
{
    _scanView.ToggleTorch();
}

private void Handle_OnScanResult(ZXing.Result result)
{
    ChassisEntry.Text = result.Text;
}


// this is in the constructor of the page
MobileBarcodeScanningOptions options = new ZXing.Mobile.MobileBarcodeScanningOptions()
{
    TryHarder = true,
    PossibleFormats = new List<ZXing.BarcodeFormat>() { ZXing.BarcodeFormat.All_1D }
};
_scanView.Options = options;

我错过了什么?

编辑

我的 MainActivity.cs

里有这个
protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    ZXing.Net.Mobile.Forms.Android.Platform.Init();
    LoadApplication(new App());
}

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
   Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
   ZXing.Net.Mobile.Forms.Android.PermissionsHandler.OnRequestPermissionsResult(requestCode, permissions, grantResults);

   base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

答案补充

@Rafeal 的回答对我有用,唯一的问题是扫描视图上没有红线。
我找到这个 workaround 来解决那个问题。
但是,这是一种解决方法,因为我注意到如果条形码位于视图中的任何位置,扫描就会发生。
虽然这似乎不是问题,但就我而言,我的纸质表格上有多达 20 个条形码,当用户想要瞄准特定条形码时,他可能会弄错。

因此,如果有人知道更好的解决方案,我想听听。
关于这个问题,我将在 SO 上单独提问。

这是我现在使用的解决方法

  <Grid VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
                <zxing:ZXingScannerView
                    x:Name="_scanView"
                    OnScanResult="Handle_OnScanResult"
                    IsScanning="true"
                    WidthRequest="200"
                    HeightRequest="200"/>


                <zxing:ZXingDefaultOverlay
                    x:Name="scannerOverlay"                                                       
                    BottomText="Place the red line over the barcode you'd like to scan.">

                </zxing:ZXingDefaultOverlay>
            </Grid>

在我的工作项目中,我使用了这个 xaml 声明:

<zxing:ZXingScannerView x:Name="qrCodeScannerView" 
                        OnScanResult="Handle_OnScanResult" 
                        IsScanning="true"
                        WidthRequest="1024" 
                        HeightRequest="400" />

请注意,我没有像您那样在 xaml 声明中设置 isAnalyzing 属性。当页面出现时,zxing 控件立即开始工作和分析。

然后在xaml.cs文件

        public void Handle_OnScanResult(Result scanResult)
        {
                qrCodeScannerView.IsScanning = false;
                // processing scanResult.Text here
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();
            qrCodeScannerView.IsScanning = true;
        }

        protected override void OnDisappearing()
        {
            base.OnDisappearing();
            qrCodeScannerView.IsScanning = false;
        }

这看起来很奇怪,但是在 xaml.cs 文件中设置 isScanning 属性 也为我解决了这个任务。

尝试从 XAML 中完全删除 ZXingScannerView。在按钮的单击事件中添加此代码:

private async void ButtonScan(object sender, EventArgs e)
{
    PermissionStatus granted = await Permissions.CheckStatusAsync<Permissions.Camera>();
    if (granted != PermissionStatus.Granted)
    {
        _ = await Permissions.RequestAsync<Permissions.Camera>();
    }
    if (granted == PermissionStatus.Granted)
    {
        try
        {
            MobileBarcodeScanner scanner = new MobileBarcodeScanner();
            ZXing.Result result = await scanner.Scan();
            if (result != null && result.Text != "")
            {
                //You access your scanned text with result.Text
                scanner.Cancel(); // <--- This closes the scanner
            }
        }
        catch (Exception)
        {
            await DisplayAlert("Problem", "Something went wrong.", "ΟΚ");
        }
    }
    else
    {
        await DisplayAlert("Problem", "No permissions to use camera.", "ΟΚ");
    }
} 

编辑

OP 提到我应该将这行代码添加到我的答案中以使其工作。

在 MainActivity.cs 中,您必须像这样初始化扫描仪:

ZXing.Mobile.MobileBarcodeScanner.Initialize(Application);