Android二维码扫描开发(一):实现思路与原理

在这里插入图片描述

现在二维码已经非常普及了,那么二维码的扫描与处理也成为了Android开发中的一个必要技能。网上有很多关于Android中二维码处理的帖子,大都是在讲开源框架zxing用法,然后贴贴代码就完了,并没有一个系统的分析和原理解析。其中涉及到的Camera的操作和YUV图像处理,也大都没有详细的介绍。所以我自己写了这篇文章,把Android二维码的开发来从头捋一下。

二维码处理流程分为几个步骤:

  1. 初始化相机,设置一些相机参数;
  2. 绑定SurfaceView,在SurfaceView上显示预览图像;
  3. 获取相机的一帧图像;
  4. 对图像进行一定的预处理,只保留亮度信息,成为灰度图像;
  5. 对灰度图像进行二维码解析,解析成功进入下一步,不成功回到第③步;
  6. 返回解析结果并退出。

流程图如下图所示:

在这里插入图片描述

一、初始化相机

相机使用的是android.hardware.Camera这个类,在Android 5.0之后,推荐使用更强大的android.hardware.Camera2这个类,为了兼容更低版本Android系统,我们在这里仍然使用Camera类来实现。

Camera可以通过setDisplayOrientation()方法设置预览图像的方向,旋转度数只能是0、90、180、270中的一个,根据需求,本例中设置为90度。

Camera还可以通过Camera.Parameters类设置预览图像的分辨率,但是只能在气可支持的分辨率中选择一个,不能随便设置,我们需要根据屏幕大小,在其中选出一个最佳的预览图像分辨率,太大浪费资源,太小会显示不清楚,具体选择方法,在代码中有,这里就不细述了。

Camera可以通过setPreviewFormat()方法来设置预览图像的数据格式,推荐选择的有ImageFormat.NV21和ImageFormat.YV12,默认是NV21。NV21属于YUV图像,和RGB图像有所不同,YUV图像在下一篇会有详细介绍。

注意在使用Camera时,需要在AndroidManifest.xml里声明一些权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.flash" />

二、绑定SurfaceView

在SurfaceView创建好后,通过Camera类的setPreviewDisplay()方法,将SurfaceHolder传入Camera。

调用Camera的startPreview()方法,Camera捕捉到的图像就会显示到SurfaceView上了。

三、获取一帧图像

调用Camera的setOneShotPreviewCallback(PreviewCallback cb)方法,可以请求获取一帧图像,获取到图像后,会调用PreviewCallback的onPreviewFrame(byte[] data, Camera camera)方法,其中的data参数就是图像的YUV数据了。

四、图像预处理

根据二维码的原理,我们只需要图像的亮度信息来进行二维码解析,所以我们要把获取到的彩色图像转换为灰度图像。YUV图像转换为灰度图像的方法,以及RGB图像转换为灰度图像的方法,在后续文章中会有介绍,这里只说原理,具体实现就不再赘述。

五、二维码解析

在这里,二维码解析使用的是google的zxing开源框架,把上一步处理后的灰度图像,封装为zxing的LuminanceSource,再封装为zxing的BinaryBitmap,然后就可以进行二维码解析了。

值得一提的是,利用zxing解析二维码是耗时操作,为避免ANR,需要写到子线程中来处理。

具体代码在这里就不贴了,后续章节中将会对zxing的使用及LuminanceSource的处理做详细解答。

六、解析结果

本例中,除了返回解析到的字符串之外,还对LuminanceSource增加了一个renderCroppedGreyScaleBitmap()方法,用来生成处理好的灰度图像Bitmap。

更多Android开发学习资料可以扫描下方二维码免费领取!

《Android编程入门指南》+Android基础课程资料包

Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。

在这里为了方便大家系统的学习Flutter,这里特意联合了阿里P7架构师和谷歌技术团队共同整理了一份适合零基础的Android全家桶学习资料。

内容概要:Android编程入门指南、Android基础课程资料包;

内容特点:条理清晰,含图像化表示更加易懂;

《Android编程入门指南》

目录

img

第一章 Java语言基础从入门到熟悉

​ ● Java综述

​ ● Java基础

​ ● class

​ ● 面向对象

​ ● 容器

​ ● 多线程

​ ● IO

​ ● 正则表达式

​ ● 日历

​ ● 注解使用与简单说明

​ ● Java使用加密算法

img

第二章 Kotlin语言基础从入门到熟悉

​ ● Kotlin系列简介

​ ● 新建项目

​ ● 概念介绍

​ ● 常用写法

​ ● lambda

​ ● 高阶函数

​ ● 扩展函数

​ ● 协程

img

第三章 Android 技术栈从入门到熟悉

​ ● 开始

​ ● Activity

​ ● Service 服务

​ ● Broadcast 广播机制

​ ● Fragment

​ ● res应用资源

​ ● 权限

​ ● TextView 显示文字

​ ● EditText 用户输入

​ ● Button 按钮

​ ● ImageView 图片显示

​ ● Layout布局

​ ● DrawerLayout侧滑栏

​ ● RecyclerView 显示列表

​ ● 多线程

​ ● IO 操作

​ ● 存储

​ ● NetWork 网络

​ ● ProgressBar进度条

​ ● View

​ ● 自定义View

​ ● 动画

​ ● WebView

​ ● StatusBar

​ ● Camera相机

​ ● Media

​ ● Bluetooth 蓝牙

​ ● WiFi连接

​ ● 获取手机当前角度

​ ● launcher

​ ● AIDL

​ ● zip

​ ● Binder

​ ● Notification 通知

​ ● PackageManager

​ ● RTFSC

​ ● 设计模式

​ ● 第三方库

​ ● Android Studio

​ ● 模块化

​ ● Gradle

​ ● NDK

​ ● 调试

img

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐