前言
开始使用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网络请求的数据。
总结
:。。