Android 同时扫描多个二维码(非zxing)

class QRCodeAnalyzer(private val listener: (List) ->Unit) : ImageAnalysis.Analyzer {
@SuppressLint(“UnsafeExperimentalUsageError”)
override fun analyze(imageProxy: ImageProxy) {
val mediaImage = imageProxy.image
if (mediaImage != null) {
val image =
InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
processImage(image = image, imageProxy = imageProxy)
}

}

private val options = BarcodeScannerOptions.Builder()
//设置扫码类型,支持同时设置多个
.setBarcodeFormats(Barcode.FORMAT_QR_CODE)
.build()
private val scanner = BarcodeScanning.getClient(options)

private fun processImage(image: InputImage, imageProxy: ImageProxy) {
scanner.process(image)
.addOnSuccessListener(listener)
.addOnFailureListener {
// Do nothing
}
.addOnCompleteListene
r {
imageProxy.close()
}
}
}

初始化

// 解析数据 Executor
private val cameraExecutor by lazy {
Executors.newSingleThreadExecutor()
}

private val viewFinder by lazy {
requireView().findViewById(R.id.viewFinder)!!
}

// 初始化相机和扫码
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())

cameraProviderFuture.addListener({
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(viewFinder.surfaceProvider)
}

// 默认选择后摄
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
val imageAnalyzer = ImageAnalysis.Builder()
.build()
.also {
it.setAnalyzer(cameraExecutor, QRCodeAnalyzer { luma ->
// 扫码结果,这里需根据项目做去重处理
Log.d(TAG, “Average luminosity: $luma”)
})
}

try {
// Unbind use cases before rebinding
cameraProvider.unbindAll()

// Bind use cases to camera
cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageAnalyzer
)

} catch (exc: Exception) {
Log.e(TAG, “Use case binding failed”, exc)
}
}, ContextCompat.getMainExecutor(requireContext()))
}
简单说明

使用mlkit进行扫码本身就支持同时扫描多个码,所以不用过多处理。代码相对使用zxing简单很多,而且效率也非常高。
演示

这里用官方的代码进行了修改,添加了绘制结果框,并对结果进行了模拟上传,框颜色和当前上传状态有关。
WechatIMG341.jpeg

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我作为AI语言模型无法提供完整的Android应用程序,但我可以给你提供一个基本的扫描二维码的代码框架,供你参考: 1. 在AndroidManifest.xml文件中添加必要的权限: ```xml <uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardware.camera"/> ``` 2. 在布局文件中添加一个SurfaceView用于显示摄像头画面: ```xml <SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 在Activity中初始化Camera和SurfaceView,并设置扫描结果的回调函数: ```java public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback { private Camera mCamera; private SurfaceHolder mHolder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mHolder = ((SurfaceView)findViewById(R.id.surface_view)).getHolder(); mHolder.addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { mCamera = Camera.open(); try { mCamera.setPreviewDisplay(holder); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Camera.Parameters params = mCamera.getParameters(); List<Camera.Size> sizes = params.getSupportedPreviewSizes(); Camera.Size selectedSize = sizes.get(0); params.setPreviewSize(selectedSize.width, selectedSize.height); mCamera.setParameters(params); mCamera.setPreviewCallback(this); mCamera.startPreview(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mCamera.release(); mCamera = null; } @Override public void onPreviewFrame(byte[] data, Camera camera) { String result = decodeQRCode(data, camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height); if (result != null) { Toast.makeText(this, result, Toast.LENGTH_SHORT).show(); } } private String decodeQRCode(byte[] data, int width, int height) { // TODO: 实现解码二维码的逻辑 return null; } } ``` 4. 在decodeQRCode方法中实现解码二维码的逻辑,可以使用第三方库来解码,比如Zxing: ```java private String decodeQRCode(byte[] data, int width, int height) { PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data, width, height, 0, 0, width, height, false); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Reader reader = new QRCodeReader(); try { Result result = reader.decode(bitmap); return result.getText(); } catch (NotFoundException | ChecksumException | FormatException e) { e.printStackTrace(); return null; } } ``` 这样就完成了一个简单的扫描二维码的程序。需要注意的是,这里只是一个简单的框架,还需要根据实际需求进行更多的代码实现和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值