基于Android的二维码的生成与识别系统的设计与实现
摘要:随着二维码的广泛应用和 Android 智能手机的进一步普及,该文介绍了一个通过 Android 平台下的摄像和绘图功能,利用二维码的编码和解码原理,通过 Android 手机对二维码的数据进行解析和编码, 实现对二维码生成和识别系统。该系统内容包括两部分:二维条码的生成系统设计和二维条码的识别系统设计。生成系统完成了从输入数据到生成相应二维码的功能,识别系统完成对采集到的二维码符号进行译码还原出所携带信息的功能.
关键词: 二维码;二维码生成;二维码识别; Android 平台
一维条码自出现以来,由于受信息容量的限制,不得不依赖数据库的存在。在没有数据库和不联网的地方,一维条码的使用受到了较大的限制。另外,要用一维条码表示汉字的场合,显得十分的不方便,且效率低下。二维码的出现是为了解决一维条码无法解决的问题而产生。因而它具有高密度、高可靠性等特点,所以可以用它表示数据文件 (包括汉字文件)图像等。
二维码是大容量、高可靠性信息实现存储、携带并自动适读的最理想的方法。手机二维码的业务类型主要有两种:一是识读,就是借助应用软件直接读出码上信息,它可以衍生出上网浏览、电子购物等多种应用;二是被读,就是由商家向手机用户发送二维码信息,通过设备识读,可作身份识别、电子凭证等之用。
1 系统相关技术分析
1.1 Android 系统架构 Android 是一种以 Linux 为基础的开放源代码操作系统,主要使用于便携设备。Android 的系统架构采用了分层的架构。android 分为四个层,分别是应用程序层、应用程序框架层、系统运行库层和 linux 内核层。随着 Android 的快速发展,如今已允许开发者使用多种编程语言来开发Android 应用程序,而不再是以前只能使用 Java 开发 Android 应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统.
1.2 开发环境系统主要分为两个大的模块:
二维码的生成和二维码的识别。二维码的生成主要就是基于 Winnows 上的开发工具 Netbeans 开发,而同时又开发一个在 Android 平台下的二维码生成。而二维码的识别主要就是基于 Android 平台来开发, 主要就是运用Android SDK 和 Eclipse 共同开发, 但是环境需要搭建。
二维码的生成主要设计的是在电脑上运行的桌面程序。通过在电脑上开发一个 Java 程序来生成二维码。其开发环境主要如下:
需求名称:平台及工具
开发工具:Net beans
优化工具:Photoshop
开发语言 :Java
运行环境:Windows XP+JDK
测试环境:Windows XP+JDK
二维码的识别和生成是在 Android 平台上的开发的, 并使用 Eclipse IDE 工具进行开发的。Eclipse IDE 安装 ADT 插件搭建了很好的 Android 开发平台,方便与编程。至于识别的功能要用到摄像头,虚拟机上面是没有摄像头的,这就需要有真机进行二维码的识别测试。Android 平台开发环境如下:
需求名称:平台及工具
开发工具:Eclipse、 Android SDK、测试机
优化工具:Photoshop
开发语言:Java
运行环境:Android 平台
测试环境:Android 平台
2 系统的设计
2.1 系统框架设计
本系统框架结构主要分成生成和识别两大部分。
识别功能主要就是对二维码和条形码的识别。主要就是通过手机的摄像头对二维码或者是条形码进行扫描,然后把把扫描到的二维码或者是条形码送到后台进行解析,如果解析成功后,就不再进行扫描。如果解析不成功,就会在进行扫描采集图像, 在传到后台解析,直到能够识别图像为止。
生成功能主要就是对二维码的生成。而生成这个功能可以在电脑上运行生成,也可以在手机上运行生成。二维码的生成主要支持名片、短信、文本、及网络书签的生成。当用户选择好多要生成的对象时, 就会把用户输入的信息送到后台,通过调用解析包,来生成还有相应信息的二维码.
2.2 二维码的生成设计二维码的生成,支持多种形式内容的二维码生成。所以用户要先进行选择要生成的类型,当选择类型以后,系统将转入到多选该类型的生成界面给用户,用户将相应的信息填写完成, 点击生成二维码,会跳转到生成界面, 显示生成的二维码。
2。3 二维码的识别设计二维码的识别主要是通过对摄像头的调用,启用多线程,对摄像头进行快速的回调应用,当一次回调的图像没有识别出来就进行下一次的回调,直到识别出二维码为止。同时由于对与二维码的大小不同,显示的模糊度不同等等原因,会使摄像头不能很好的采集图像,在这里要使摄像头能够进行自动对焦,从而使识别更快的实现.当识别完成以后就对用户进行提醒, 对手机进行震动和播放声音,播放完成,显示识别出来的结果.
3 系统的实现
3.1 二维码生成的实现二维码的生成主要是靠官方相应的编码包,将用户输入字符转换成二维数组,然后根据二维码的编码规范,使用绘图功能将二维码进行绘制。二维码的生成主要分为名片、短信、文本、、网络书签的生成。需要有相应的框架使程序与用户进行交互,使用户有选择自己想要生成的类型,然后就是用户将自己想编辑的信息输入到系统内,系统应该提供相应的交互界面给用户输入.
该功能具体代码如下:
public void QREncode(String strEncoding, int qrcodeVersion){
c。swetake。util.Qrcode testQrcode = new
c。swetake。util。Qrcode();testQrcode。setQrcodeErrorCorrect('M');
testQrcode.setQrcodeEncodeMode('B');
testQrcode。setQrcodeVersion(qrcodeVersion);
byte[] bytesEncoding = Bytes("utf—8”);
if (bytesEncoding.length > 0) {
boolean[][] bEncoding =  testQrcode。calQrcode(bytesEncoding);drawQRCode
(bEncoding,getResources()。getColor(R.drawable.bl ack));
eclipse android
}
//绘制条形码
private void drawQRCode(boolean[][] bRect, int colorFill) {
Int intPadding = 20;
Canvas mC = mSurfaceHolder01。lockCanvas();
Paint mP = new Paint();
mP1.setStyle(Paint.Style.FILL);
mP.setColor(colorFill); mP1。setStrokeWidth(1.0F);
For (int i = 0; i 〈 bRect。length; i++){
for (int j = 0; j < bRect。length; j++) {
if (bRect[j][i]){
mC.drawRect(new Rect(intPadding + j * 3 + 2, intPadding + i  * 3 +2,intPadding + j * 3 + 2 + 3, intPadding + i * 3 + 2 +  3), mP1);    }
}
}
mSurfaceHolder01.unlockCanvasAndPost(mC1);
3.2 二维码识别的实现
系统在手机上实现图像的采集是重要的一步, Android 平台上,在是使用Camera 类来完成摄像头的调用和图像采集使用 Camera mCamera = Camer—a。open () 获得 Camera 的实例,然后使用 Camer—a.Parameters 来设置获得图像的大小,最后通过实现 Camera。 Preview-Callback 的接口 onPreviewFrame ( byte〕data,Camera camera)来获得摄像头的图像数据 data。〔为能够较快地获得清晰的图像, 提高识别速度,文中使用了自动对焦技术。另外还应该对对焦进行定时操作,这就需要设置一个定时器对自动对焦进行定时调用。后台对摄像头传过来的图像数据 data 进行解码处理,如果能够解析出来,则上面的对焦调用,摄像头回传图像数据调用等将暂停。如果解析不成功,则继续轮回调用。节约解析的时间 .后台对摄像头传过来的图像数据 data 进行解码处理,如果能够解析出来,则上面的对焦调用, 摄像头回传图像数据调用等将暂停。如果解析不成功,则继续轮回调用.节约解析的时间。主要实现代码如下:
public void handleMessage(Message message) {
switch  (message.what) {
case R。id。auto_focus:  if (state == State。PREVIEW){  ().requestAutoFocus(this,R.id.auto_focs;
}
break;
case R。id。restart_preview:Log。d(TAG, "Got restart preview message");
restartPreviewAndDecode();
break;
case R.id。decode_succeeded: Log。d(TAG, "Got decode succeeded message");
state = State.SUCCESS; Bundle bundle = message。getData();
Bitmap barcode = bundle == null ? null : (Bitmap)  bundle 。getParcelable(DecodeThread.BARCODE_BITMAP);activity。handleDecode((Result) message.obj, barcode);
}
break;
case R。id.decode_failed: state = State.PREVIEW;
<().requestPreviewFrame(Ha ndler(), R。id.decode);
break;
case R。id。return_scan_result: Log。d(TAG, "Got return scan  result message");
activity。setResult(Activity.RESULT_OK, (Intent)  message。obj);
activity.finish();
break;
case R.id。launch_product_query: Log.d(TAG, "Got product  query  message”);
String url = (String) message。obj;
Intent intent = new Intent(Intent.ACTION_VIEW,  Uri。parse(url));
intent。addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RE
SET);
activity。startActivity(intent); break; }
4 结束语
本课题的研究目的是实现二维条码的生成与识别系统设计,设计内容包括两部分:二维条码的生成系统设计和二维条码的识别系统设计。生成系统完成了从输入数据到生成相应二维码的功能,识别系统完成对图像的自动采集和数据编码解析。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。