Java 条形码扫描仪使用ML套件仅读取QR码

Java 条形码扫描仪使用ML套件仅读取QR码,java,android,barcode-scanner,firebase-mlkit,Java,Android,Barcode Scanner,Firebase Mlkit,我正试图用ML工具包在android studio中构建一个条形码扫描仪。我有一个代码,工作良好,它只是检测二维码。我想让条形码扫描器能够读取所有类型的条形码,主要是食品的条形码。我试图获取条形码的原始值,以便在数据库中进行搜索,并将相关信息显示在屏幕上 下面是我用来检测二维码的代码 public class MainActivity extends AppCompatActivity { CameraView camera_view; boolean isDetected =

我正试图用ML工具包在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);
    }
}
public类MainActivity扩展了AppCompatActivity{
摄像机视图;
布尔值isDetected=false;
私人按钮btn\u再次启动;
FirebaseVisionBarcodeDetectorOptions;
FirebaseVisionBarcodeDetector探测器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Dexter.withActivity(本)
.withPermissions(新字符串[]{Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO})
.withListener(新的MultiplePermissionsListener(){
@凌驾
已检查许可证上的公共无效(多个许可证报告){
设置摄像头();
}
@凌驾
public void onPermissionRationalAlleshouldbeshown(列出权限、PermissionToken令牌){
Toast.makeText(getApplicationContext(),“您必须接受权限”,Toast.LENGTH\u LONG.show();
}
}).检查();
}
专用照相机(){
btn\u再次开始=(按钮)findViewById(R.id.btn\u再次);
btn_再次启动。setEnabled(false);
btn_再次启动。setOnClickListener((视图v)->isDetected=!isDetected);
camera_view=(CameraView)findViewById(R.id.CameraView);
摄像机视图。设置生命周期所有者(此);
camera_view.addFrameProcessor(新的FrameProcessor(){
@凌驾
公共无效进程(@NonNull Frame){
processImage(getVisionImageFromFrame(frame));
}
});
FireBaseVisionBarCodeDetector选项=
新的FirebaseVisionBarcodeDetectorOptions.Builder()
.setBarcodeFormats(
FirebaseVisionBarcode.FORMAT\u QR\u代码,
FirebaseVisionBarcode.FORMAT_-AZTEC)
.build();
检测器=FirebaseVision.getInstance().getVisionBarcodeDetector(选项);
}
私有void processImage(FirebaseVisionImage图像){
如果(!isDetected){
检测器。检测图像(图像)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(列出FireBaseVisionBarcode){
processResult(firebaseVisionBarcodes);
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Toast.makeText(getApplicationContext(),“e.getMessage()”,Toast.LENGTH\u LONG.show();
}
});
}
}
私有void processResult(列出firebaseVisionBarcodes){
如果(firebaseVisionBarcodes.size()>0){
isDetected=true;
btn_再次启动。设置已启用(isDetected);
用于(FirebaseVisionBarcode项目:firebaseVisionBarcodes){
Rect bounds=item.getBoundingBox();
Point[]corners=item.getCornerPoints();
字符串rawValue=item.getRawValue();
int value_type=item.getValueType();
开关(数值型){
案例FirebaseVisionBarcode.TYPE_文本:
{
createDialog(item.getRawValue());
}
打破
案例FirebaseVisionBarcode.TYPE\u URL:
{
Intent Intent=newintent(Intent.ACTION_视图,Uri.parse(item.getRawValue());
星触觉(意向);
}
案例FirebaseVisionBarcode.TYPE\联系方式\信息:
{
字符串信息=新的StringBuilder(“名称:”)
/*.append(item.getContactInfo().getName().getFormattedName())
.append(“\n”)*/
.附加(“地址”)
.append(item.getContactInfo().getAddresses().get(0.getAddressLines())
.append(“\n”)
.append(“电子邮件:”)
.append(item.getContactInfo().getEmails().get(0.getAddress())
.toString();
创建对话框(信息);
}
打破
违约:
{
createDialog(rawValue);
}
打破
}
}
}
}
私有void创建对话框(字符串文本){
AlertDialog.Builder=新建AlertDialog.Builder(此);
builder.setMessage(文本);
setPositiveButton(“确定”((DialogInterface dialog,inti)->dialog.Disease());
AlertDialog=builder.create();
dialog.show();
}
私有FirebaseVisionImage GetVisionImage FromFrame(框架){
字节[]数据=frame.getData();
FirebaseVisionImageMetadata=新的FirebaseVisionImageMetadata.Builder()
.setFormat(FireBaseVisionManageMetadata.IMAGE\u格式\u NV21)
.setHeight(frame.getSize().getHeight())
.setWidth(frame.getSi