我正在尝试使用集成的条形码扫描仪编写应用程序。 我遵循了本教程: 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
答案 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