Как настроить Google Vision QR Scanner на обнаружение только одного значения? - PullRequest
0 голосов
/ 14 февраля 2019

Я реализовал QR-сканер (класс QRScanner), используя Google Vision API.Как только значение обнаружено, оно передается другому действию (класс Info) с помощью Intents.Проблема заключается в том, что после сканирования QR-кода класс Info открывается несколько раз. Я хочу ограничить класс QRScanner, чтобы получить только одно значение QR, а информация классифицируется как открываемая только один раз.

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 вызывался только один раз.

Ответы [ 4 ]

0 голосов
/ 28 февраля 2019

После некоторых исследований я узнал, как это исправить.Однако после возврата к этому действию путем нажатия кнопки «Назад» из действия, загруженного через намерение, сканер больше не будет работать, поэтому метод onCreate () должен быть перезагружен.

рабочий код

if(qrCodes.size()>0)
    {

        barcodeDetector.release(); //stops the scanner from reading multiple values
        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);
            }
        });
    }

Причина, по которой cameraSource.stop () не будет работать, объясняется в этой ссылке;https://stackoverflow.com/a/41024780/6737536

надеюсь, это поможет !!

0 голосов
/ 14 февраля 2019

Я думаю, вам нужно собрать данные и передать их за пределы внутреннего класса.

Пример:

@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
    final SparseArray<Barcode> qrCodes = detections.getDetectedItems();
    final String qrData = "";
    if(qrCodes.size()>0){
        qrResult.post(new Runnable() {
            @Override
            public void run() {
                qrData = qrCodes.valueAt(0).displayValue;
            }
        });
    }
    qrResult.setText(qrData);
    goToPage(qrData);
}


private void goToPage (String qrData) {
    Intent intent = new Intent(QrScanner.this,IDNA.Info.class);
    intent.putExtra(QR_CODE,qrData);
    startActivity(intent);
}
0 голосов
/ 14 февраля 2019

Использовать эту библиотеку MobileVisionBarcodeScanner

Вы можете включать и отключать многократное сканирование .setSupportMultipleScan(true/false)

и останавливать сканирование с использованием

barcodeCapture.stopScanning();

лотовтам больше возможностей.

0 голосов
/ 14 февраля 2019

Ваша камера непрерывно обнаруживает QRCode, и ваша активность открывается несколько раз.Поэтому вам нужно остановить камеру, когда вы обнаружите что-либо успешно.

 if(qrCodes.size()>0)
        {

            cameraSource.stop(); // ADD THIS. THIS WILL STOP CAMERA
            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);
                }
            });
        }
...