【问题标题】:How to detect only one value from Google Vision QR Scanner?如何从 Google Vision QR 扫描仪中仅检测一个值?
【发布时间】:2019-02-13 18:55:24
【问题描述】:

我已经使用 Google Vision API 实现了一个 QR 扫描仪(QRScanner 类)。一旦检测到一个值,它就会使用 Intents 传递给另一个活动(信息类)。问题是,一旦扫描了 QR 码,Info 类就会被打开几次。我想限制 QRScanner 类只获取一个 QR 值,并且 Info 类只能打开一次。

QRScanner 类

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

    cameraPreview = (SurfaceView) findViewById(R.id.camera_surface);
    qrResult = (TextView) findViewById(R.id.scannerResult);
    setupCamera();
}

private void setupCamera() {

    BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.QR_CODE).build();
    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 holder) {

            if (ActivityCompat.checkSelfPermission(QrScanner.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            try {
                cameraSource.start(cameraPreview.getHolder());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

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


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

        }

        @Override
        public void receiveDetections(Detector.Detections<Barcode> detections) {

            final SparseArray<Barcode> qrCodes = detections.getDetectedItems();

            if(qrCodes.size()>0)
            {
                qrResult.post(new Runnable() {
                    @Override
                    public void run() {

                        qrResult.setText(qrCodes.valueAt(0).displayValue);
                        Intent intent = new Intent(QrScanner.this,Info.class);
                        intent.putExtra(QR_CODE,qrCodes.valueAt(0).displayValue);
                        startActivity(intent);
                    }
                });
            }
        }
    });
}

信息类

Intent intent = getIntent();
    QRCODE = (String) intent.getStringExtra(QrScanner.QR_CODE);

    DB = FirebaseDatabase.getInstance();
    ref = DB.getReference().child("Animals").child(QRCODE);
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            String DBAnimalClass = dataSnapshot.child("class").getValue().toString();
            String DBAnimalFamily = dataSnapshot.child("family").getValue().toString();
            String DBAnimalOrder = dataSnapshot.child("order").getValue().toString();

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

目前,一旦检测到 QR,Info 类就会被多次调用。我希望 QRScanner 只获得一个值,Info 类只被调用一次

【问题讨论】:

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


【解决方案1】:

在开始活动之前,您需要释放 BarCodeDetector。在调用Runnable之前使用barcodeDetector.release()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多