【问题标题】:Google Vision crashes when 2 codes are presented出现 2 个代码时,Google Vision 崩溃
【发布时间】:2018-07-02 04:33:19
【问题描述】:

我在我的应用程序中使用谷歌视觉来读取条形码和二维码。这很好用,但是当扫描的表面有 2 个代码彼此相邻时它会崩溃,如下图所示。

即使单独扫描代码也能正确扫描代码,也会发生这种情况。有谁知道如何阻止这种情况发生?

这是管理代码扫描活动的代码:

public class ScanningActivity extends AppCompatActivity {

    SurfaceView cameraPreview;
    BarcodeDetector barcodeDetector;
    CameraSource cameraSource;
    final Integer requestCameraPermissionID = 1001;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home_activity_add_scanner);

        final int height = getSurfaceViewHeight();
        final int width = getSurfaceViewWidth();

        cameraPreview = findViewById(R.id.surfaceview_scanner);

        barcodeDetector = new BarcodeDetector.Builder(AddScanningActivity.this)
                .setBarcodeFormats(Barcode.ALL_FORMATS)
                .build();
        cameraSource = new CameraSource.Builder(AddScanningActivity.this, barcodeDetector)
                .setAutoFocusEnabled(true)
                .setRequestedPreviewSize(width, height)
                .build();
        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 (barcodes.size() != 0) {
                    Vibrator vibrator = (Vibrator) getApplicationContext().getSystemService(VIBRATOR_SERVICE);
                    vibrator.vibrate(100);

                    Handler handler = new Handler(Looper.getMainLooper());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            cameraSource.release();
                        }
                    });
                }
            }
        });
        cameraPreview.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                            ActivityCompat.requestPermissions(AddScanningActivity.this,
                                    new String[]{Manifest.permission.CAMERA}, requestCameraPermissionID);
                            return;
                        }
                        try {
                            cameraSource.start(cameraPreview.getHolder());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }, 100);
            }

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

            }

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

    private Integer getSurfaceViewHeight() {
        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        Integer screenHeight = size.y;

        Rect rectangle = new Rect();
        Window window = getWindow();
        window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
        final int statusBarHeight = rectangle.top;

        int[] attrs = new int[]{R.attr.actionBarSize};
        TypedArray ta = this.obtainStyledAttributes(attrs);
        final int actionBarHeight = ta.getDimensionPixelSize(0, -1);
        ta.recycle();
        return screenHeight - statusBarHeight - actionBarHeight;
    }

    private Integer getSurfaceViewWidth() {
        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        return size.x;
    }
}

【问题讨论】:

    标签: android crash qr-code barcode-scanner google-vision


    【解决方案1】:

    问题是在释放 cameraSource 之前第二次调用了 receiveDetections 方法。然后第二次调用,该方法再次尝试释放cameraSource,但是已经不可用了,导致报错。下面是工作代码,它只有一个很小的简单变化,即使用布尔'codeDetected':

    public class AddScanningActivity extends AppCompatActivity {
    
        SurfaceView cameraPreview;
        BarcodeDetector barcodeDetector;
        CameraSource cameraSource;
        final Integer requestCameraPermissionID = 1001;
        Boolean codeDetected = false;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.home_activity_add_scanner);
    
            final int height = getSurfaceViewHeight();
            final int width = getSurfaceViewWidth();
    
            cameraPreview = findViewById(R.id.surfaceview_scanner);
    
            barcodeDetector = new BarcodeDetector.Builder(AddScanningActivity.this)
                    .setBarcodeFormats(Barcode.ALL_FORMATS)
                    .build();
            cameraSource = new CameraSource.Builder(AddScanningActivity.this, barcodeDetector)
                    .setAutoFocusEnabled(true)
                    .setRequestedPreviewSize(width, height)
                    .build();
            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 (barcodes.size() != 0 && !codeDetected) {
                            codeDetected = true;
                            Vibrator vibrator = (Vibrator) getApplicationContext().getSystemService(VIBRATOR_SERVICE);
                            vibrator.vibrate(100);
    
                            Handler handler = new Handler(Looper.getMainLooper());
                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    cameraSource.release();
                                }
                            });
                        }
                }
            });
            cameraPreview.getHolder().addCallback(new SurfaceHolder.Callback() {
                @Override
                public void surfaceCreated(SurfaceHolder surfaceHolder) {
                    final Handler handler = new Handler();
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                                ActivityCompat.requestPermissions(AddScanningActivity.this,
                                        new String[]{Manifest.permission.CAMERA}, requestCameraPermissionID);
                                return;
                            }
                            try {
                                cameraSource.start(cameraPreview.getHolder());
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }, 100);
                }
    
                @Override
                public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
    
                }
    
                @Override
                public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
                    cameraSource.stop();
                }
            });
        }
    
        private Integer getSurfaceViewHeight() {
            Display display = getWindowManager().getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            Integer screenHeight = size.y;
    
            Rect rectangle = new Rect();
            Window window = getWindow();
            window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
            final int statusBarHeight = rectangle.top;
    
            int[] attrs = new int[] {R.attr.actionBarSize};
            TypedArray ta = this.obtainStyledAttributes(attrs);
            final int actionBarHeight = ta.getDimensionPixelSize(0, -1);
            ta.recycle();
            return screenHeight - statusBarHeight - actionBarHeight;
        }
    
        private Integer getSurfaceViewWidth() {
            Display display = getWindowManager().getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            return size.x;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 2023-04-03
      • 2020-01-25
      • 1970-01-01
      • 2015-12-04
      • 2020-04-09
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      相关资源
      最近更新 更多