前一篇博客主要是将如何来将百度地图控件插入app中,这篇将如何在app中实现二维码的扫描和识别。
相关apk的安装包下载地址为(可以下载下来体验一下):下载地址
二维码(QR code)
二维码又叫做二维条码,但是我们在移动平台上见得最多的是QR Code,QR的全称叫做Quick Response,这是一个近几年来的移动设备上非常流行的一种编码方式。二维码就是利用某种特定的几何图形按照一定的规律分布的黑白相间的图案用来记录数据的。我们可以从QR的全称看出来,超高速的识别特点是QR Code区别的别的条形二维码一个大特点。因此,这次项目我也决定使用QR Code来实现扫码开锁。
这里我会用到一个zxing库,这个库是谷歌开源的一个库,用java实现的用来识别多种格式的1D/2D条形码的图像管理库,目的是为了让开发者更好更方便地使用摄像头,这个库里面有非常多的功能,而我们需要用到的只是其中的两个功能:生成特定内容的二维码、扫描识别二维码。
Zxing库的使用
首先我们需要在gitHub上下载Zxing库,地址是:
当然我们也可以使用网上别人已有的项目,将其中的Zxing库的部分移植过来。这里我使用的方法是移植别人的项目。首先我们将库里面需要用的几个包复制到我们的项目里面,如图 :
从上面的包的名字我们也可以大致看出每个包的作用:第一个Android包是用来完成基本的操作的,包括捕捉,扫描完成之后发出声音等操作的,camera是和摄像头有关的,decode和encode分别使用来进行解码和编码的,view是对完成窗口里面的控件的一些操作以及添加自定义的控件。
此外我们还需要一个安卓中用来生成二维码的jar包,即core-3.0.0.jar,我们将它复制到libs目录里面,并且添加路径。
1、配置权限
我们之前了解到,凡是用到的活动(activity)都需要在AndroidManifest.xml里面进行配置,同样的,因为开启扫描二维码这也是一个新的活动,所以我们也需要进行权限的声明,另外因为扫描二维码还用到了别的器件,诸如闪光灯,摄像头,震动等,因此我们也需要进行声明。所以我们需要添加如下的内容:
<uses-permission Android:name="Android.permission.CAMERA" />
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.VIBRATE" />
<uses-permission Android:name="Android.permission.FLASHLIGHT" />
<activity
Android:name="com.karics.library.zxing.Android.CaptureActivity"
Android:theme="@Android:style/Theme.NoTitleBar"
Android:screenOrientation="portrait" > </activity>
2、布局文件
这里扫描二维码的页面里面我们用到了一个返回键的button,一个显示“扫一扫”的textview,这两个空间都在一个Relative Layout的布局里面。然后在这个布局的部分下面还有一个Relative Layout的布局,里面盛放了一个imagebutton,他的背景图片是一个闪光的标志,通过按下这个按钮,我们可以打开闪光灯。
这里面还有一个自定义的控件,它是一个扫描取景框。
3、生成并扫描二维码
Zxing库里面提供了可以生成特定内容的二维码的工具,在之前的encode包的EncodingUtil类里面有一个静态的函数createQRCode(),这个函数可以生成以特定字符串为内容的二维码。生成了二维码之后我们还需要将这个图片保存在手机之中,才能方便我们之后来使用。这里我们将这个bitmap二维码保存在手机的系统图库里面。
接下来扫描二维码的工作我们需要进入到另外一个活动——CaptureActivity,启动了这个活动我们才能扫描二维码,从一个活动进入另外活动需要使用intent(意图),因为这个活动我们已经注册过了,我们使用显示的intent来开启新活动,关键代码如下:
Intent intent=new Intent(SecondActivity.this,CaptureActivity.class);
这个函数的第一个参数是启动活动的上下文,因为我们这里是从SecondActivity里面启动新的活动,所以上下文是SecondActivity.this,第二个参数是指定要启动的目标活动的class。
扫描完二维码之后会返回结果,它会自动跳转到调用intent的活动里面,所以我们只须要覆写onActivityResult()函数,并在这个函数里面接收返回的值,并判断值是否符合要求,然后执行相对应的行为。整个工作过程的流程框图如图所示: