Firebase ML 套件的二维码扫描仪多次扫描每个二维码

Firebase ML kit's QR Code Scanner Scans each QR Code Multiple Times

我的扫描仪多次扫描单个 QR 码,这就是为什么我的 createDialog 方法 运行s 多次我在其中获取有关 QR 码和使用它的用户以及发布它和存储数据的代理的信息进入 Db 中的用户节点,因为它 运行 多次,我的 Db 无法跟踪编号。每个用户扫描二维码的次数..

 private void setupCamera() {
    startAgain.setEnabled(isDetected);
    startAgain.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            isDetected = !isDetected;
        }
    });
    cameraView.setLifecycleOwner(this);
    cameraView.addFrameProcessor(new FrameProcessor() {
        @Override
        public void process(@NonNull Frame frame) {
            processorImage((FirebaseVisionImage) getVisionImageFromFrame(frame));
        }
    });
    options = new FirebaseVisionBarcodeDetectorOptions.Builder()
            .setBarcodeFormats(FirebaseVisionBarcode.FORMAT_QR_CODE)
            .build();
    detector = FirebaseVision.getInstance().getVisionBarcodeDetector(options);
}

private Object getVisionImageFromFrame(Frame frame) {
    byte[] data = frame.getData();
    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
            .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
            .setHeight(frame.getSize().getHeight())
            .setWidth(frame.getSize().getWidth())
            .build();
    return FirebaseVisionImage.fromByteArray(data, metadata);
}

private void processorImage(FirebaseVisionImage image) {
    if (!isDetected) {
        detector.detectInImage(image)
                .addOnSuccessListener(new OnSuccessListener<List<FirebaseVisionBarcode>>() {
                    @Override
                    public void onSuccess(List<FirebaseVisionBarcode> firebaseVisionBarcodes) {
                        processResult(firebaseVisionBarcodes);
                    }
                }).addOnCompleteListener(new OnCompleteListener<List<FirebaseVisionBarcode>>() {
            @Override
            public void onComplete(@NonNull Task<List<FirebaseVisionBarcode>> task) {

            }
        })
                .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(StoreScanQR.this, e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

private void processResult(List<FirebaseVisionBarcode> firebaseVisionBarcodes) {
    if (firebaseVisionBarcodes.size() > 0) {
        isDetected = true;
        startAgain.setEnabled(isDetected);
        for (FirebaseVisionBarcode item : firebaseVisionBarcodes) {
                    try {
                        createDialog(item.getRawValue());
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
        }
    }
}

检测是一个异步调用,因此在您获得第一个结果之前,可能会使用不同的输入触发多次。如果您只关心第一个检测到的结果,您可以在结果处理端(即在#onSuccess 回调中)而不是检测触发端检查您的 isDetected 标志。

@Override
public void onSuccess(List<FirebaseVisionBarcode> firebaseVisionBarcodes) {
    if (!isDetected) {
        processResult(firebaseVisionBarcodes);
    }
}