BarcodeDetector仅应在单击按钮时扫描

时间:2019-03-28 12:59:55

标签: c# xamarin.android

我正在尝试使用集成的条形码扫描仪编写应用程序。 我遵循了本教程: https://www.c-sharpcorner.com/article/xamarin-android-qr-code-reader-by-mobile-camera/

扫描正常且非常快(在我使用ZXing.Net.Mobile之前,它的运行速度慢得惊人)。 现在,我需要一些帮助来集成该应用程序,该应用程序仅在用户按下按钮时才检测到一个条形码,而不是整个时间都检测到。也许延迟也可以解决问题。

protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            // Set our view from the "main" layout resource  
            SetContentView(Resource.Layout.ScannerTest);
            surfaceView = FindViewById<SurfaceView>(Resource.Id.cameraView);
            txtResult = FindViewById<TextView>(Resource.Id.txtResult);
            barcodeDetector = new BarcodeDetector.Builder(this)
                .SetBarcodeFormats(BarcodeFormat.Code128 | BarcodeFormat.Ean13 | BarcodeFormat.QrCode)
                .Build();
            cameraSource = new CameraSource
                .Builder(this, barcodeDetector)
                .SetRequestedPreviewSize(320, 480)
                .SetAutoFocusEnabled(true)
                .Build();

            surfaceView.Click += StartScanning;
            surfaceView.Holder.AddCallback(this);
            //barcodeDetector.SetProcessor(this);
        }
private void StartScanning(object sender, EventArgs e)
{
        barcodeDetector.SetProcessor(this);
}
public void ReceiveDetections(Detections detections)
        {
            SparseArray qrcodes = detections.DetectedItems;
            if (qrcodes.Size() != 0)
            {
                txtResult.Post(() => {
                    //Vibrator vibrator = (Vibrator)GetSystemService(Context.VibratorService);
                    //vibrator.Vibrate(1000);
                    txtResult.Text = ((Barcode)qrcodes.ValueAt(0)).RawValue;
                });
            }
        }

此刻,用户按下SurfaceView时,扫描仪将启动,并且永不停止。

是否有可能在按下“按钮”后仅扫描一个?

r3d007

2 个答案:

答案 0 :(得分:1)

1在OnCreate方法中取消注释此行

barcodeDetector.SetProcessor(this);

2从SurfaceCreated和OnRequestPermissionsResult方法中删除或注释此行

cameraSource.Start(surfaceView.Holder);

3您的StartScanning方法应调用Start

private void StartScanning(object sender, EventArgs e)
{
    cameraSource.Start(surfaceView.Holder);
}

4阅读并验证代码后,请停止扫描程序

public void ReceiveDetections(Detections detections)
{
    SparseArray qrcodes = detections.DetectedItems;
    if (qrcodes.Size() != 0)
    {
        txtResult.Post(() => {
            //Vibrator vibrator = (Vibrator)GetSystemService(Context.VibratorService);
            //vibrator.Vibrate(1000);
            txtResult.Text = ((Barcode)qrcodes.ValueAt(0)).RawValue;
        });

        using (var h = new Handler (Looper.MainLooper))
        h.Post (() => {
            cameraSource.Stop();
        });

    }
}

为防止崩溃,还可以考虑隐藏或禁用按钮,直到获得相机许可以及扫描仪已经启动为止。

答案 1 :(得分:0)

您需要在扫描过程触发后添加它。必须添加“-”运算符以防止不间断工作。您在此行插入事件

//adds the handler
surfaceView.Click += StartScanning;

之后,您需要这个。

 // removes the handler
surfaceView.Click -= StartScanning;

还要看here