《基于Android的二维码的生成与识别系统的设计与实现设计报告》由会员分享,可在线阅读,更多相关《基于Android的二维码的生成与识别系统的设计与实现设计报告(15页珍藏版)》请在金锄头文库上搜索。
1、 基于基于 AndroidAndroid 的二维码的生成与识别系统的设计与实现的二维码的生成与识别系统的设计与实现摘要: 随着二维码的广泛应用和 Android 智能手机的进一步普及, 该文介 绍了一个通过 Android 平台下的摄像和绘图功能,利用二维码的编码和解码原 理, 通过 Android 手机对二维码的数据进行解析和编码, 实现对二维码生成 和识别系统。该系 统内容包括两部分:二维条码的生成系统设计和二维条码的 识别系统设计。生成系统完成了从输入数据到生成相应二维 码的功能, 识别 系统完成对采集到的二维码符号进行译码还原出所携带信息的功能。 关键词: 二维码; 二维码生成; 二维
2、码识别; Android 平台 一维条码自出现以来,由于受信息容量的限制,不得不依赖数据库的存在。 在没有数据库和不联网的地方,一维条码的使用受 到了较大的限制。另外, 要用一维条码表示汉字的场合,显得十分的不方便, 且效率低下。 二维码的 出现是为了解决一维条码无法解决的问题而产生。因而它具有高密度、高可靠 性等特点,所以可以用它表示数据文 件 (包括汉字文件)图像等。 二维码是大容量、 高可靠性信息实现存储、携带并自动适读的最理想的方法。 手机二维码的业务类型 主要有两种:一是识读,就是借助应用软件直接读出码 上信息,它可以衍生出上网浏览、电子购物等多种应用; 二是被读,就是由商 家向手机
3、用户发送二维码信息,通过设备识读,可作身份识别、电子凭证等之 用。 1 系统相关技术分析1.1 Android 系统架构 Android 是一种以 Linux 为基础的开放源代码操 作系统,主要使用于便携设备。Android 的系统架构采用了分层的架构。 android 分为四个层, 分别是应用程序层、 应用程序框架层、 系统运行库层 和 linux 内核层。随着 Android 的快速发展,如今已允许开发者使用 多种编 程语言来开发 Android 应用程序,而不再是以前只能使用 Java 开发 Android 应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式 操作系统。
4、 1.2 开发环境 系统主要分为两个大的模块: 二维码的生成和二维码的识别。二维码的生成主要就是基于 Winnows 上的 开发工具 Netbeans 开 发, 而同时又开发一个在 Android 平台下的二维码生 成。而二维码的识别主要就是基于 Android 平台来开发, 主要就是运用 Android SDK 和 Eclipse 共同开发, 但是环境需要搭建。 二维码的生成主要设计的是在电脑上运行的桌面程序。通过在电脑上开发 一个 Java 程序来生成二维码。其开发环境主要如下:需求名称 :平台及工具开发工具 :Net beans 优化工具 :Photoshop开发语言 :Java运行环境
5、 :Windows XP+JDK 测试环境 :Windows XP+JDK二维码的识别和生成是在 Android 平台上的开发的, 并使用 Eclipse IDE 工具进行开发的。Eclipse IDE 安装 ADT 插件搭建了很 好的 Android 开 发平台, 方便与编程。至于识别的功能要用到摄像头, 虚拟机上面是没有摄 像头的, 这就需要有真机进行二维码的 识别测试。Android 平台开发环境如 下: 需求名称 :平台及工具 开发工具 :Eclipse、 Android SDK、 测试机 优化工具 :Photoshop 开发语言 :Java 运行环境 :Android 平台 测试环境
6、 :Android 平台 2 系统的设计 2.1 系统框架设计 本系统框架结构主要分成生成和识别两大部分。 识别功能主要就是对二维码和条形码的识别。主要就是通过手机的摄像头对二 维码或者是条形码进行扫描, 然后把把扫描到 的二维码或者是条形码送到后 台进行解析, 如果解析成功后, 就不再进行扫描。如果解析不成功, 就会在 进行扫描采集图像, 在传到后台解析, 直到能够识别图像为止 。生成功能主要就是对二维码的生成。而生成这个功能可以在电脑上运行生成, 也可以在手机上运行生成。二维码的生成主要 支持名片、 短信、 文本、 电 子邮件及网络书签的生成。当用户选择好多要生成的对象时, 就会把用户输入
7、 的信息送到后台, 通过调用 解析包, 来生成还有相应信息的二维码。2.2 二维码的生成设计 二维码的生成, 支持多种形式内容的二维码生成。 所以用户要先进行选择要生成的类型,当选择类型以后,系统将转入到多选 该 类型的生成界面给用户, 用户将相应的信息填写完成, 点击生成二维码, 会 跳转到生成界面, 显示生成的二维码。 2.3 二维码的识别设计 二维码的识别主要是通过对摄像头的调用, 启用 多线程, 对摄像头进行快速的回调应用, 当一次回调的图像没有识别出来就 进 行下一次的回调, 直到识别出二维码为止。同时由于对与二维码的大小不 同, 显示的模糊度不同等等原因,会使摄像头不能很好 的采集
8、图像, 在这里 要使摄像头能够进行自动对焦,从而使识别更快的实现。当识别完成以后就对 用户进行提醒, 对手机进行震动和播放声音,播放完成,显示识别出来的结果。3 系统的实现 3.1 二维码生成的实现 二维码的生成主要是靠官方相应的编码包, 将用 户输入字符转换成二维数组, 然后根据二维码的编码规范, 使用绘图功能将 二 维码进行绘制。二维码的生成主要分为名片、 短信、 文本、 电子邮件、 网络书签的生成。需要有相应的框架使程序与用户进行交互, 使用户有选择自 己想要生成的类型, 然后就是用户将自己想编辑的信息输入到系统内, 系统应该提供相应的交互界面给用户输入。 该功能具体代码如下: publ
9、ic 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 = strEncoding.getBytes(“utf-8“); if (bytesEnc
10、oding.length 0) boolean bEncoding = testQrcode.calQrcode(bytesEncoding); drawQRCode(bEncoding,getResources().getColor(R.drawable.bl ack); /绘制条形码 private void drawQRCode(boolean bRect, int colorFill) Int intPadding = 20; Canvas mC = mSurfaceHolder01.lockCanvas(); Paint mP = new Paint();mP1.setStyle(P
11、aint.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 (bRectji) mC.drawRect(new Rect(intPadding + j * 3 + 2, intPadding + i * 3 +2,intPadding + j * 3 + 2 + 3, intPadding + i * 3 + 2 + 3), mP1); mSurfaceHolder01.u
12、nlockCanvasAndPost(mC1); 3.2 二维码识别的实现 系统在手机上实现图像的采集是重要的一步, Android 平台上, 在 是使 用 Camera 类来完成摄像头的调用和图像采集 使用 Camera mCamera = Camer- a. open () 获得 Camera 的实例, 然后使用 Camer-a.Parameters 来设置获 得图像的大小,最后通过实现 Camera. PreviewCallback 的接口 onPreviewFrame( bytedata,Camera camera) 来获得摄像头的图像数据 data。 为能够较快地获得清晰的图像, 提
13、高识别速度,文中使用了自动对焦 技术。另外还应该对对焦进行定时操作, 这就需要设置一个定时器对自动对焦 进行定时调用。 后台对摄像头传过来的图像数据 data 进行解码处理,如果能 够解析出来,则上面的对焦调用, 摄像头回传图像数据调用等将暂停。如果解析不成功, 则继续轮回调用。节约解析的时间 。后台对摄像头传过来的图像 数据 data 进行解码处理, 如果能够解析出来,则上面的对焦调用, 摄像头 回传图像数据调用等将暂 停。如果解析不成功,则继续轮回调用。节约解析的 时间。主要实现代码如下:public void handleMessage(Message message) switch (
14、message.what) case R.id.auto_focus: if (state = State.PREVIEW) CameraManager.get().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“
15、);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; CameraManager.get().requestPrev
16、iewFrame(decodeThread.getHa 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(Int