设备方向锁定横置时使用budiyev扫描库识别一维条码问题求解
问题根因
一维条码的解码逻辑本身没有方向校正能力,默认只能识别条码朝向和相机采集图像方向一致的场景;而二维码自带定位校正图案,支持任意角度识别,所以只有一维条码会在你说的场景下识别失败。
优先使用无侵入配置方案(无需修改库源码)
在你现有初始化CodeScanner的代码后追加以下配置即可:
import com.google.zxing.BarcodeFormat import com.google.zxing.DecodeHintType // 配置解码参数 val decodeHints = hashMapOf<DecodeHintType, Any>() // 开启TRY_HARDER模式,会自动尝试旋转图像识别不同朝向的一维条码 decodeHints[DecodeHintType.TRY_HARDER] = true // 配置你需要支持的所有条码格式,按需添加用到的一维码格式即可 decodeHints[DecodeHintType.POSSIBLE_FORMATS] = listOf( BarcodeFormat.CODE_128, BarcodeFormat.CODE_39, BarcodeFormat.EAN_13, BarcodeFormat.EAN_8, BarcodeFormat.UPC_A, BarcodeFormat.QR_CODE ) mCodeScanner?.apply { setDecodeHints(decodeHints) // 开启自动旋转适配,即使系统方向锁定也会基于传感器调整解码方向 isRotationEnabled = true isAutoZoomEnabled = true startPreview() }
同时建议你升级zxing核心库版本,老版本3.2.1对多方向一维码的支持较差,升级到3.5.1即可,无兼容性问题:
implementation 'com.google.zxing:core:3.5.1'
配置无效时修改少量库源码
如果上面的配置还是无法覆盖所有场景,你只需要修改导入模块的CodeScanner类两处逻辑即可,总改动量不到50行:
- 新增简单的方向传感器监听,获取用户当前持机的物理角度,不需要申请额外权限
- 在解码执行前,将相机输出的图像帧按获取到的物理角度旋转后再传给zxing解码
内容的提问来源于stack exchange,提问作者Kamran Khan
相关产品推荐
相关产品推荐

