首页 > 解决方案 > 我开发了一个 android 应用程序,它可以扫描产品上标记的 QR 码。像 Inigma 这样的应用程序运行良好,但我的应用程序无法扫描

问题描述

在代码优化方面需要帮助。我开发了一个 android 应用程序,它可以扫描产品上标记的QR 码。

我已经测试了一些其他应用程序(如 Inigma)运行良好但我的应用程序无法扫描的场景:以下情况:

1)当我扫描在线生成的二维码时,我的应用程序和 inigma 都可以正常工作

.2) 当我扫描瓶子等产品上打印的二维码时,我的应用程序无法扫描,但 inigma 扫描完美。

我在哪里落后?有人可以帮帮我吗?我必须从过去 1 周开始尝试解决这个问题,但没有得到解决方案。

技术细节:我正在使用ZXING库进行 QR 码扫描。

请帮忙 ... :(

标签: android2dqr-codezxing.net

解决方案


尝试使用此方法并在 onResume() 循环中调用该方法

private void initialiseDetectorsAndSources() {
//        Bitmap bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.ic_notfound)).getBitmap();
        BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(BarCodeScanActivity.this)
                .setBarcodeFormats(Barcode.ALL_FORMATS)
                .build();

        cameraSource = new CameraSource.Builder(this, barcodeDetector)
                .setRequestedPreviewSize(1920, 1080)
                .setFacing(CameraSource.CAMERA_FACING_BACK)
                .setAutoFocusEnabled(true) //you should add this feature
                .build();

        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                try {
                    if (ActivityCompat.checkSelfPermission(BarCodeScanActivity.this, Manifest.permission.CAMERA)
                                                                                    == PackageManager.PERMISSION_GRANTED) {
                        cameraSource.start(surfaceView.getHolder());
                    } else {
                        ActivityCompat.requestPermissions(BarCodeScanActivity.this, new
                                String[]{Manifest.permission.CAMERA}, AppUtils.CAMERA_PERMISSION);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

            }
        });

        barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
            @Override
            public void release() {
//                Toast.makeText(BarCodeScanActivity.this, "To prevent memory leaks barcode scanner has been stopped", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void receiveDetections(Detector.Detections<Barcode> detections) {
                final SparseArray<Barcode> barcodes = detections.getDetectedItems();

                if (barcodes != null && barcodes.size() > 0) {
                    available.post(new Runnable() {
                        @Override
                        public void run() {
                            String scandata = barcodes.valueAt(0).displayValue;
// the scandata is your barcode
                        }
                    });
                }
            }
        });
}

推荐阅读