Android 使用MK kit 扫码识别


前言

开始使用ZXing扫码,测试机运行的还正常,换了台机后,运行很卡,退出也是反应好慢,就换其他的扫码组件,看了支付宝的,免费但是要注册同意收集数据,考虑后用MK kit,MK kit使用需要结合Camera X一起使用。


一、MK Kit

是Google的一款开源项目【ML Kit 通过一个强大且易用的软件包将 Google 的机器学习专业知识带给移动开发者。借助专为在设备上运行而优化的解决方案,让您的 iOS 和 Android 应用更具吸引力、更加个性化和实用。】

官网

二、使用步骤

1.加依赖

build:

//有重复依赖,自己剔除
//ML Kit
    implementation 'com.google.android.gms:play-services-code-scanner:16.1.0'
    implementation 'com.google.mlkit:barcode-scanning:17.3.0'
    implementation "androidx.camera:camera-core:1.0.2"
    implementation "androidx.camera:camera-camera2:1.0.2"
    implementation "androidx.camera:camera-lifecycle:1.0.2"
    implementation "androidx.camera:camera-view:1.0.0-alpha25"
    implementation "androidx.camera:camera-extensions:1.0.0-alpha25"

    implementation "androidx.camera:camera-core:1.0.0-beta08" // 请检查最新版本
    implementation "androidx.camera:camera-camera2:1.0.0-beta08" // 如果使用 Camera2 实现
    implementation "androidx.camera:camera-lifecycle:1.0.0-beta08" // 如果你需要生命周期支持
    implementation 'com.google.mlkit:object-detection:17.0.2'
    implementation 'com.google.android.gms:play-services-code-scanner:16.0.0'//google

2.读入数据

代码如下(示例):

 //region XCamera
    private void onStartCamera() {
        //这用于将相机的生命周期绑定到生命周期所有者  这消除了打开和关闭相机的任务,因为 CameraX 具有生命周期感知能力
        final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
        cameraProviderFuture.addListener(() -> {
            try {
                ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                bindCameraUseCases(cameraProvider);
            } catch (ExecutionException | InterruptedException e) {
                e.printStackTrace();
            }
        }, ContextCompat.getMainExecutor(this));
    }
   //
    private void bindCameraUseCases(ProcessCameraProvider cameraProvider) {
        Preview preview = new Preview.Builder().build();
        preview.setSurfaceProvider(previewView.getSurfaceProvider()); // 将预览显示在ViewFinder上

        cameraSelector = new CameraSelector.Builder()
                .requireLensFacing(CameraSelector.LENS_FACING_BACK) // 前置摄像头  CameraSelector.LENS_FACING_FRONT
                .build();
        imageCapture = new ImageCapture.Builder().build();
        Camera camera= cameraProvider.bindToLifecycle(this,cameraSelector,preview);
        BarcodeScanner barcodeScanner=BarcodeScanning.getClient();
        //ImageAnalysis
        ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
                .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
                .build();

        cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector,imageAnalysis); // 绑定生命周期和用例
        //imageAnalysis
        imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this), new ImageAnalysis.Analyzer() {
            @Nullable
            @ExperimentalGetImage
            @Override
            public void analyze(@NonNull ImageProxy image) {
                Image mediaImage=image.getImage();
                if(mediaImage!=null)
                {
                    InputImage inputImage=InputImage.fromMediaImage(mediaImage,image.getImageInfo().getRotationDegrees());
                    barcodeScanner.process(inputImage)
                            .addOnSuccessListener(new OnSuccessListener<List<Barcode>>() {
                                @Override
                                public void onSuccess(List<Barcode> barcodes) {
                                    Log.v(TAG,"okkkkkkkkk"+barcodes.size());
                                    if(barcodes.size()==0)
                                    {
                                        image.close();
                                    }
                                    else
                                    {
                                        for (Barcode barcode:barcodes)
                                        {
                                            //获取二维码的数据,然后解析
                                            if(barcode.getFormat()==Barcode.FORMAT_QR_CODE)
                                            {
                                                Log.v(TAG,"QR_CODE:"+barcode.getRawValue());
                                            }
                                            else
                                            {
                                                Log.v(TAG,barcode.getFormat()+":"+barcode.getRawValue());
                                            }
                                        }
                                    }
                                }
                            })
                            .addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    Log.v(TAG,"onFailure:"+e.toString());
                                    image.close();//关闭要分析的图片后,系统会传送下一个最新图片
                                }
                            })
                            .addOnCanceledListener(new OnCanceledListener() {
                                @Override
                                public void onCanceled() {
                                   Log.v(TAG,"onCanceled");
                                }
                            });
                }
   
            }
        });
    }

该处使用的url网络请求的数据。


总结

:。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值