必须先使用setProcessor设置检测器处理器才能接收检测结果

问题描述

我正在使用Mobile Vision API扫描QR码。

我在活动中使用此方法来使用相机捕获代码:

private void createCameraSource() {
    final BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(this).build();
    if(!barcodeDetector.isOperational()){
        Toast.makeText(this,"No se puede utilizar el detector de códigos de barra",Toast.LENGTH_LONG).show();
        this.finish();
    }
    else {
        final CameraSource cameraSource = new CameraSource.Builder(this,barcodeDetector)
                .setAutoFocusEnabled(true)
                .setRequestedPreviewSize(1600,1024)
                .build();
        cameraPreview.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                if (ActivityCompat.checkSelfPermission(RegisterActivity.this,Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
                    try {
                        cameraSource.start(cameraPreview.getHolder());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder surfaceHolder,int i,int i1,int i2) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
                cameraSource.stop();
            }
        });

        barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
            @Override
            public void release() {

            }

            @Override
            public void receiveDetections(Detector.Detections<Barcode> detections) {
                final SparseArray<Barcode> barcodes = detections.getDetectedItems();
                if (!RegisterActivity.this.isProcessing() && barcodes.size() > 0) {
                    barcodeDetector.release();
                    RegisterActivity.this.setProcessing(true);
                    Intent intent = new Intent(RegisterActivity.this,ResultActivity.class);
                    intent.putExtra("code",codigo);
                    intent.putExtra("data",barcodes.valueAt(0));
                    setResult(CommonStatusCodes.SUCCESS,intent);
                    startActivity(intent);
                    RegisterActivity.this.setProcessing(false);
                    finish();
                }

            }
        });
    }
}

检测到并读取代码后,我需要将该代码传递给其他活动。这就是为什么我有以下代码:

                if (!RegisterActivity.this.isProcessing() && barcodes.size() > 0) {
                    barcodeDetector.release();
                    RegisterActivity.this.setProcessing(true);
                    Intent intent = new Intent(RegisterActivity.this,intent);
                    startActivity(intent);
                    RegisterActivity.this.setProcessing(false);
                    finish();
                }

当我运行应用程序时,此异常显示在日志猫中:

2020-08-27 18:19:53.894 11076-11746/com.company.myapp E/CameraSource: Exception thrown from receiver.
    java.lang.IllegalStateException: Detector processor must first be set with setProcessor in order to receive detection results.
        at com.google.android.gms.vision.Detector.receiveFrame(com.google.android.gms:play-services-vision-common@@19.1.2:17)
        at com.google.android.gms.vision.CameraSource$zza.run(com.google.android.gms:play-services-vision-common@@19.1.2:47)
        at java.lang.Thread.run(Thread.java:929)
2020-08-27 18:19:53.956 11076-11746/com.company.myapp E/CameraSource: Exception thrown from receiver.
    java.lang.IllegalStateException: Detector processor must first be set with setProcessor in order to receive detection results.
        at com.google.android.gms.vision.Detector.receiveFrame(com.google.android.gms:play-services-vision-common@@19.1.2:17)
        at com.google.android.gms.vision.CameraSource$zza.run(com.google.android.gms:play-services-vision-common@@19.1.2:47)
        at java.lang.Thread.run(Thread.java:929)

该应用程序正常运行是因为新活动已打开,并且可以在其中接收读取的代码,但是,如果我在该活动中设置了断点并开始调试,则调试器会话将在几秒钟后结束,而不会再出现错误。 >

该代码有什么问题?

解决方法

调试有时会更改代码的行为。尤其是当您的框架可与android等许多线程一起使用时。

在stacktrace at java.lang.Thread.run(Thread.java:929)中,我想说的是,在调用setProcessor之前,当前未处于调试状态的线程中的某些代码希望使用Decoder。

在Java中,只有正在调试的线程将在断点处停止,其他线程不会被触及,并且在达到断点时也不会停止。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...