如何解决必须先使用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中,只有正在调试的线程将在断点处停止,其他线程不会被触及,并且在达到断点时也不会停止。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。