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