Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 条形码检测器应仅在单击按钮时进行扫描_C#_Xamarin.android - Fatal编程技术网

C# 条形码检测器应仅在单击按钮时进行扫描

C# 条形码检测器应仅在单击按钮时进行扫描,c#,xamarin.android,C#,Xamarin.android,我正在尝试编写一个集成条形码扫描仪的应用程序。 我遵循了本教程: 扫描效果很好,速度也很快(在我使用ZXing.Net.Mobile之前,速度非常慢)。 现在我需要一些帮助来整合,当用户按下按钮时,应用程序只检测一个条形码,而不是整个时间。也许拖延一下也能解决问题 protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState);

我正在尝试编写一个集成条形码扫描仪的应用程序。 我遵循了本教程:

扫描效果很好,速度也很快(在我使用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);
        }
此时,用户按下SurfaceView,扫描仪启动且从不停止

有没有可能,它只是在按下“按钮”后扫描一个


r3d007

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

//adds the handler
surfaceView.Click += StartScanning;
之后你需要这个

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

同时查看OnCreate方法中的取消注释这一行

barcodeDetector.SetProcessor(this);
2从SurfaceCreated和OnRequestPermissionsResult方法中删除或注释此行

cameraSource.Start(surfaceView.Holder);
3您的StartScaning方法应该调用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();
        });

    }
}

为了防止崩溃,还考虑隐藏或禁用按钮,直到获得相机权限,并且当扫描仪已经启动时。

这将EVENDENDELL从Survivew中移除,并且不停止扫描过程。您的扫描过程在哪里可以共享?尝试这种方式,并且第一次点击按钮,它扫描并在找到结果后停止扫描。但是,当我再次单击按钮时,它不会开始扫描,并且没有其他按钮工作。甚至Android的“后退”按钮也不起作用。@r3d007检查更新,崩溃是在更新停止时引起的,而不是在您尝试重新启动时,receiveDetections方法中的代码正在另一个线程上运行,因此,您需要从handlerI my case中发布cameraSource.Stop(),我已将多个api调用到txtreult.post(()={})我遇到的问题是ReceiveDetections方法调用了多次,我的API也调用了多次。我怎样才能避免这种情况。任何形式的帮助都是非常合适的。@DanielBrughera请看一看。这是我的问题,看看这个可能会有帮助。
private void StartScanning(object sender, EventArgs e)
{
    cameraSource.Start(surfaceView.Holder);
}
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();
        });

    }
}