簡體   English   中英

Firebase ML 套件的 QR 碼掃描儀可多次掃描每個 QR 碼

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

我的掃描儀多次掃描單個 QR 碼,這就是為什么我的 createDialog 方法多次運行的原因,在該方法中我獲取有關 QR 碼和使用它的用戶以及發布它並將數據存儲到 Db 中的用戶節點的代理的信息,並且因為它運行多個時間我的 Db 無法跟蹤編號。 為每個用戶掃描 qr 碼的次數..

 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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM