上一篇
安卓代码扫描
- 行业动态
- 2025-04-24
- 5
安卓代码扫描需申请相机权限,集成ZXing库,通过Intent调起扫描界面,处理回调结果,实现二维码/条码识别,应用于登录、支付等
安卓代码扫描实现方案
第三方库方案(以ZXing为例)
依赖配置
步骤 | 操作 |
---|---|
添加Maven依赖 | implementation 'com.google.zxing:core:3.5.0' implementation 'com.journeyapps:zxing-android-embedded:4.3.0' |
申请权限 | 在AndroidManifest.xml 中添加:<uses-permission android:name="android.permission.CAMERA"/> |
布局设计
<FrameLayout android:id="@+id/camera_preview" android:layout_width="match_parent" android:layout_height="match_parent"> <!-可叠加扫描框、闪光灯按钮等UI --> </FrameLayout>
核心代码
// 初始化扫描器 val scanner = ZXingScanner(cameraPreview) scanner.setResultHandler { result, barcode -> // 处理扫描结果 if (result != null) { val data = result.text // 跳转或执行业务逻辑 } } // 启动相机预览 scanner.startCamera()
原生CameraX + ML Kit方案
依赖配置
库 | 用途 |
---|---|
CameraX | 相机管理 |
ML Kit | 条码识别 |
implementation "androidx.camera:camera-core:1.1.0" implementation "androidx.camera:camera-camera2:1.1.0" implementation "com.google.mlkit:barcode-scanning:17.0.0" |
相机预览与识别
// 创建CameraProvider val cameraProviderFuture = ProcessCameraProvider.getInstance(this) cameraProviderFuture.addListener({ val cameraProvider = cameraProviderFuture.get() val preview = Preview.Builder().build() val barcodeScanner = BarcodeScanner.Builder(this) .setBarcodeFormats(Barcode.FORMAT_QR_CODE, Barcode.FORMAT_CODE_128) .build() // 绑定生命周期 cameraProvider.bindToLifecycle(this, cameraSelector, preview, barcodeScanner) }, ContextCompat.getMainExecutor(this))
方案对比
维度 | ZXing方案 | CameraX+ML Kit方案 |
---|---|---|
开发难度 | 低(成熟封装) | 中(需熟悉CameraX) |
功能扩展 | 支持多种格式 | 支持复杂场景识别 |
性能消耗 | 较高(独立相机管理) | 较低(系统级优化) |
兼容性 | 需适配旧设备 | 天然支持新API |
常见问题与解决
相机权限被拒绝
- 现象:应用崩溃或黑屏
- 解决方案:
// 动态申请权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), REQUEST_CODE) }
扫描成功率低
- 原因:光线不足/焦距不准/条码污损
- 优化策略:
- 开启闪光灯(
scanner.setTorch(true)
) - 调整相机对焦模式(
ImageCapture.Builder().setFocusMode(FocusMode.AUTO)
) - 限制扫描区域(通过
Rect
指定ROI区域)
- 开启闪光灯(
相关问题与解答
Q1:如何在扫码后自动聚焦?
- A1:在ZXing中可通过
scanner.setAutoFocus(true)
启用自动对焦;在CameraX中需手动配置FocusMeteringAction
。
Q2:如何支持多种条码格式(如PDF417)?
- A2:在ZXing中调用
setBarcodeFormats(BarcodeFormat.QR_CODE, BarcodeFormat.PDF_417)
;在ML Kit中通过BarcodeScanner.Builder
添加`Barcode.FORMAT_PDF417