Android 使用原生相机Camera在预览界面进行识别二维码或者图片处理

1 项目需求

最近项目中有个需求:使用原生相机在预览界面进行识别二维码和图片处理。其实这个需求不是很难,难在对预览画面的处理过程。

自己针对这个需求写了一个工具类,便于后续进行复盘,同时也分享给有类似需求的伙伴们。

2 遇到的问题

2.1 二维码识别成功率低

使用了第三方库,二维码成功率应该没有90%。我们客户要求比较高,二维码识别成功率要求几乎100%。后面会给出关键核心代码。现在先给出成功率不高的代码。

这里使用的第三方库是:
implementation ‘com.google.zxing:core:3.4.1’
implementation ‘com.journeyapps:zxing-android-embedded:3.6.0’


... 省略工具类其他部分代码,只看二维码识别部分代码

private final Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {
   
        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
   
            Camera.Parameters parameters = camera.getParameters();
            Camera.Size size = parameters.getPreviewSize();
			
			// 二维码识别
            decodeQRCode(data, size.width, size.height);
        }
    };

/**  二维码识别  */
private void decodeQRCode(byte[] data, int width, int height) {
   
        MultiFormatReader reader = new MultiFormatReader();
        try {
   
            PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data, width, height,
                    0, 0, width, height, false
            );

            Result result = reader.decode(new BinaryBitmap(new HybridBinarizer(source)));
            if (result != null){
   
                Log.e(TAG, "扫码结果 = " + result.getText());
            }

            if (result != null && result.getText().length() > 0) {
   
                if (callback != null) {
   
                    callback.onQRCodeScanned(true, result.getText());
                }
            } else {
   
                if (callback != null) {
   
                    callback.onQRCodeScanned(false, "");
                }
            }
        } catch (Exception e) {
   
            Log.e(TAG, "扫码异常 = " + e.getMessage());
            if (callback != null) {
   
                callback.onQRCodeScanned(false, "");
            }
        }
    }

2.2 相机预览没物体时偶尔出现画面模糊

如下图。偶尔出现这样模糊画面。
在这里插入图片描述

3 相机工具类核心代码

实现主要流程:

1 打开相机
2 Camera 相关设置
3 预览时数据处理
4 关闭相机
/**
 * @author linvisf
 * 
 * description: 相机工具类
 * //分辨率 1920 * 1088  1920 * 1080  1440 * 1080  1280 * 720  720 * 480  640 * 480  352 * 288  320 * 240
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值