簡體   English   中英

條碼掃描器使用 ML Kit 僅讀取 QR 碼

[英]Barcode scanner is reading only QR codes using ML Kit

我正在嘗試使用 ML Kit 在 android studio 中構建條形碼掃描儀。 我有一個工作正常的代碼,它只能檢測二維碼。 我想讓條碼掃描器能夠讀取所有類型的條碼,主要是食品條碼。 我正在嘗試獲取條形碼的原始值,以便在數據庫中進行搜索並將相關信息顯示到屏幕上。

下面是我用來檢測二維碼的代碼。

public class MainActivity extends AppCompatActivity {
    CameraView camera_view;
    boolean isDetected = false;
    private Button btn_start_again;

    FirebaseVisionBarcodeDetectorOptions options;
    FirebaseVisionBarcodeDetector detector;

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

        Dexter.withActivity(this)
                .withPermissions(new String [] {Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO})
                .withListener(new MultiplePermissionsListener() {

                    @Override
                    public void onPermissionsChecked(MultiplePermissionsReport report) {

                        setUpCamera();

                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {

                        Toast.makeText(getApplicationContext(),"You must accept the permissions",Toast.LENGTH_LONG).show();

                    }
                }).check();

    }

    private void setUpCamera() {

        btn_start_again =(Button)findViewById(R.id.btn_again);
        btn_start_again.setEnabled(false);

        btn_start_again.setOnClickListener((View v) -> isDetected = !isDetected);

        camera_view = (CameraView) findViewById(R.id.cameraview);
        camera_view.setLifecycleOwner(this);

        camera_view.addFrameProcessor(new FrameProcessor() {
            @Override
            public void process(@NonNull Frame frame) {

                processImage(getVisionImageFromFrame(frame));


            }
        });

        FirebaseVisionBarcodeDetectorOptions options =
                new FirebaseVisionBarcodeDetectorOptions.Builder()
                        .setBarcodeFormats(
                                FirebaseVisionBarcode.FORMAT_QR_CODE,
                                FirebaseVisionBarcode.FORMAT_AZTEC)
                        .build();
        detector = FirebaseVision.getInstance().getVisionBarcodeDetector(options);

    }

    private void processImage(FirebaseVisionImage image) {

        if(!isDetected){

            detector.detectInImage(image)
                    .addOnSuccessListener(new OnSuccessListener<List<FirebaseVisionBarcode>>() {
                        @Override
                        public void onSuccess(List<FirebaseVisionBarcode> firebaseVisionBarcodes) {

                            processResult(firebaseVisionBarcodes);

                        }
                    })

                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {

                            Toast.makeText(getApplicationContext(),"e.getMessage()",Toast.LENGTH_LONG).show();

                        }
                    });


        }

    }

    private void processResult(List<FirebaseVisionBarcode> firebaseVisionBarcodes) {

        if(firebaseVisionBarcodes.size() > 0 ){

            isDetected = true;
            btn_start_again.setEnabled(isDetected);

            for (FirebaseVisionBarcode item:firebaseVisionBarcodes){

                Rect bounds = item.getBoundingBox();
                Point[] corners = item.getCornerPoints();

                String rawValue = item.getRawValue();

                int value_type = item.getValueType();
                switch (value_type){
                    case FirebaseVisionBarcode.TYPE_TEXT:
                    {
                        createDialog(item.getRawValue());
                    }
                    break;
                    case FirebaseVisionBarcode.TYPE_URL:
                    {

                        Intent intent =  new Intent(Intent.ACTION_VIEW, Uri.parse(item.getRawValue()));
                        startActivity(intent);

                    }
                    case FirebaseVisionBarcode.TYPE_CONTACT_INFO:
                    {

                        String info = new StringBuilder("Name:")
                                /*.append(item.getContactInfo().getName().getFormattedName())
                                .append("\n")*/
                                .append("Address")
                                .append(item.getContactInfo().getAddresses().get(0).getAddressLines())
                                .append("\n")
                                .append("Email:")
                                .append(item.getContactInfo().getEmails().get(0).getAddress())
                                .toString();
                        createDialog(info);

                    }
                    break;

                    default:
                    {

                        createDialog(rawValue);

                    }
                    break;


                }

            }

        }

    }

    private void createDialog(String text) {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setMessage(text);
        builder.setPositiveButton("OK", ((DialogInterface dialog, int i) -> dialog.dismiss()));

        AlertDialog dialog = builder.create();
        dialog.show();

    }

    private FirebaseVisionImage 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();
                //.setRotation(frame.getRotation())

        return FirebaseVisionImage.fromByteArray(data,metadata);
    }
}

你也有硬件問題。

安卓設備的攝像頭通常只有在正確對焦的情況下才能讀取條形碼,而這只會發生在后置攝像頭上,因為前置攝像頭通常沒有自動對焦功能。

相反,即使沒有很好地聚焦,也會讀取 QR 碼。

此外,普通相機讀取條碼的速度較慢,如果您想要一款能夠快速讀取所有條碼的設備,請尋找帶有內置條碼閱讀器的設備,它們被稱為 PDA,盡管它們比智能手機貴得多。

暫無
暫無

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

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