




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
物理电气信息学院本科毕业论文PAGEPAGE43毕业设计(2013届)题目基于手持设备的二维码图像的生成与识别学院物理电气信息学院专业通信工程年级2009级学生学号12009243683学生姓名高丽指导老师郭中华摘要近几年,在智能手机系统群雄纷争的时候,2008年Google推出了一款名为Android的开源智能手机操作系统,受到广大手机生产商的重视。对于二维码技术而言,我国对二维码这一技术的需求与日俱增。目前,二维码技术在食品质量追溯上的使用已越来越广泛,借助二维码溯源系统,可以实现食品生产、流通及消费的全过程监控。因此,基于手机平台的二维码识别系统及应用的研究,无论是在理论上还是在实践中都具有十分重要的意义。本文是基于Android环境下完成二维码生成和识别功能。首先对Android开发环境、组成与架构以及AndroidSDK和Eclipse开发工具进行了介绍;其次介绍了二维码技术的认识,主要是从二维码技术特点、二维码溯源系统和二维码的应用前景这几个方面进行了介绍,突出了二维码技术的优势以及在溯源系统中的重要性;接着分析了QRCode二维码的结构、标准及编解码过程,在对这个所设计的二维码全面了解之后,重点的对基于Android系统的二维码生成以及识别的过程展开设计。关键词:Android;二维码技术;QRCode;二维码生成;二维码识别
ABSTRACTInrecentyears,undertheintelligentmobilephonesystemwarlordsdisputing,GoogledevelopedanopensourceoperatingsystemofintelligentmobilephonewhichwecallittheAndroidsystem,attractedmanufacturers’attention,in2008years.Forthetwo-dimensionalcodetechnology,weneedofthe2Dcodetechniquehasbeenmoreandmorewidely,usedinfoodqualitytraceability,wecanrealizethefoodproduction,circulationandconsumptionofthewholeprocessmonitoring.Sothestudyofdesigningthe2DcodebasedonAndroidisverysignificant.Thisarticleismainlytalkaboutthattocompletetheproductionandrecognitionoftwodimensionbar-codebasedontheAndroidenvironment.First,itistheintroductionoftheAndroiddevelopmentenvironment,composition,construction,AndroidSDKandEclipsedevelopmenttool.Next,theintroductionoftwodimensionbar-codetechnology,mainlyfocusedonthespecialcharacteristics,tracingsystem,applicationprospectoftwodimensionbar-code,highlightedthesuperiorityandtheimportanceintracingsystemoftwodimensionbar-code.Then,theanalysisofthestructure,standardandencodinganddecodingprocessofQRCode,afteroverallunderstandingofthisdesigningtwodimensionbar-code,thispaperwillkeycarryonroundlydesignofAndroidsystem-basedtheproductionandrecognitionoftwodimensionbar-code.KeyWords:Android;2DCode;QRCode;2DCodegeneration;2DCoderecognition目录TOC\o"1-3"\u第一章绪论 11.1研究背景与意义 11.2国内外发展现状 21.2.1国内发展历史 21.2.2国外发展历史 41.3研究内容 6第二章开发环境 82.1Android开发平台 92.1.1Android平台的组成 92.1.2Android系统的架构 92.1.3Android系统的应用程序组件 112.1.4Android系统的应用程序举例 122.2开发工具(Eclipse、AndroidSDK、) 13第三章二维码的生成 213.1QRcode的简介 213.1.1QRCode的结构与特性 213.1.2QRCode的标准 233.1.3QRCode的编码及译码过程 233.2基于Android系统的QR码生成 25第四章二维码识别系统的实现 274.1开源利器zxing 274.2基于zxing的二维码识别 284.3源码系统分析 29第五章总结与展望 34感谢语 35参考文献: 36附录1 38附录2 39第一章绪论二维码(2-dimensionalcode)作为一种信息存储和传递技术,是按照特定的编码规则形成的平面几何图形[1-4]。二维码能够在横向和纵向两个方位同时表达信息。它具有存储容量大、可靠性高、保密防伪性强、成本低等优点,可以用来存储多国文字、数据文件、图像等信息。随着3G时代的来临,手机二维码的应用越来越丰富[5-8]。Android系统作为目前最为流行的智能手机平台,其与二维码技术的结合时二维码信息已各类业务的形式在手机中存贮、阅读和传播。手机既可以作为二维码信息的载体结合二维码识读设备加以应用,也可以在手机中内置或下载二维码识读引擎来识读商品上的二维码标识,从而获取二维码内隐含的有效信息来进行相关应用的开发。在许多种类的二维码中,常用的又:DataMatrix,MaxiCode,Aztec.QRCode,Vericode,PDF417,Utracode.Code49,Code16K等[9]。其中快速响应码(QuickResponsecode,QR码)[10-11]是应用最为成功的一种二维码,QR码是一种矩阵式二维码,信息容量大,一张条码可以放入1817个汉字,或7089个数字,或4200个英文字母;支持字母、数字、汉字、照片、指纹、音/视频等信息嵌入。跟其他二维码相比,QR码具有识读速度快、数据密度大、占地空间小的优势.把QR码运用在手机平台上,开发基于Android手机系统的二维码生成和识别系统具有重要的理论意义和实际价值。1.1研究背景与意义近几年,在智能手机系统群雄纷争的时候,2008年Google推出了一款名为Android的开源智能手机操作系统。Android凭借其开放性和良好的人机界面,受到广大手机生产商的重视。目前手机数量已大大超过传统PC机的数量,手机上网将变得越来越方便和普及,Android对3G的良好支持使得Android在网络方面的优势更为突出。由于Android基于Linux内核且具有开源免费的特性[12],它迅速得到广大爱好者以及许多厂商的支持。同时Android开源智能操作系统在物联网的应用中有着广泛的应用前景[13]。二维码是一个跨媒体的通道,不管是报纸、杂志、户外、液晶媒体等只要在上面有一个二维码,就可以通过二维码来跟人互动,获取更多的信息。二维码与手机的结合能够为我们带来任何时间、任何地点,通过任何媒介获取任何内容。在日本和韩国,超过8成的手机用户通过手机“扫码上网”和购买电子票据,给人们的日常生活带来了极大的便利。近年来,在国内也得到了快速的发展,并在多个行业成功应用,如:张学友07北京演唱会二维码电子票;上海世博手机门票等[14]。手机二维码是二维码技术在手机上的应用,将手机需要访问、使用的信息编码到二维码中,利用手机的摄像头识读。利用手机二维码上网,为你省去了为手机上网输入冗长的网址,手机用户只需通过扫描二维码下面的号码或关键字即可上网,随时下载如图文、音乐、视频、获取优惠劵、参与抽奖、了解企业产品信息等。同时,还可以方便地用手机自动输入短信、识别和存储名片,实现电子地图查询定位,获取公共服务(如天气预报)等多种功能。二维码业务为商家构筑自己的WAP平台提供了可能,为其他媒体提供了一个与用户随时随地沟通的方式。商家或媒体可以搭建自己的WAP网站,用户对相应的二维码进行扫描后即可获取更为生动而丰富的内容。1.2国内外发展现状1.2.1国内发展历史2004年中国移动在内部交流大多会将手机条码业务提上议事日程,当时采用的还是来自NTTDoCoMo的条码手机产品。2005年开始在湖南长沙、上海试点手机二维码业务:长沙主要是与麦当劳合作进行手机二维码折扣劵的试点工作(接入行业应用):国内两大移动电话营业商不断探索二维码的发展应用,为手机二维码业务的善及和推广做出了积极的贡献。中国联通公司于2006年5月推出国内第一款条码手机ET980:中国移动公司于2006年8月推出手机二维码应用条码识别业务,并且与多家手机二维码解决方案提供商进行了合作。这都极大的促进了手机二维码业务的发展。自此,手机二维码不断出现在各大媒体网站中,成为电信领域关注的焦点。手机二维码在国内的应用现状手机二维码在日本和韩国应用时间较早,使用的人群多,在很多行业得到了广泛的应用。虽然国内起步晚,但近3你那发展势头迅速,目前有八大类应用经过市场初步检验已趋于成熟,酱紫啊今后的市场中进一步得到完善和推广[15]。移动订票中国第一张电子电影票2005年由翼码信息推出,这种形式将传统票变成电子票,将物流变成电子流,在节省成本的同时,提高了效率。积分兑换采用手机二维码的积分兑换方式后,用户可以随时随地提出兑换申请,并到就近的兑换点兑换礼品。电子VIP以二维码VIP电子卡代替传统实体VIP卡,VIP客户只要携带手机,就可以享受服务。目前全球通VIP易登机的系统已经在全国除港澳台地区的62家主要机场安装完毕。电子折扣劵电子折扣劵得以实现无纸化,直接发掉用户手机中,使用者只需携带手机即可享受餐饮、娱乐、旅游、百货购物的各种折扣优惠。电子提货劵用电子凭证的形式替代传统的提货卷,条码凭证已广泛应用到实物营销、实物派送等方面,大大方便了商家和消费者。自助充值机乘客购买电子客票后,登录相关网站,输入身份证号机航班等信息,便可以自行选择作为,完成自助值机。之后,乘客只需带着手机在机场专用自助设备扫描换取实体的登机牌,就可通过安检并登记。能够更好的体验查询、订票、登记一站式的轻松。电子导诊用户可以通过手机终端预约挂号,凭二维码电子凭证在预约时间前往医院直接取号,大大减少了排队挂号、候诊的时间,为用户提供了一种新型的就医模式。电子签到会议、展览、活动通知于签到,用于企业访客登记与安排。1.2.2国外发展历史手机二维码应用主要包括以下几种形式。移动支付:手机的支付一般是通过手机钱包来实现的,手机钱包可以当作现金、储蓄卡、保管柜钥匙、火车票等。如今,越来越多的功能都汇聚到手机钱包的功能中,这给用户带来了极大的便利。手机支付是手机二维码最典型的应用,二维码被广泛地应用于不同的支付方式中。例如,日本的NTTDoCoMo公司采用二维码技术来实现移动支付,用户可以通过二维码在便利店中支付手机账单。账单信息会被储存在二维码中,并可以通过i-mode的计费中心下载到用户的移动终端上。二维码还可以处理更复杂的信息,商店收费处的扫描器可以读取包含计费信息的二维码,用户可以直接支付现金给收费处。交易的信息则通过收费处传送回计费中心。电子票务:电子票务也是二维码的典型应用,该应用需要结合售票单位的网站、售票信息发布平台共同完成。消费者如果有购票的需求,可通过上网等方式查找相关的票务信息,然后可根据相关信息发短信至售票系统,再按提示进行手机支付。支付完成后,售票系统会把电子票以二维码的形式发送到购票者手机中,完成购票流程。日本最大的航空公司日航就提供移动票务服务。顾客不仅可以通过手机或互联网购买客票,还能通过读卡器识别手机上的代码,完成检票并获得登机牌。日航还在机场各处安装读卡器,用户可以使用手机或卡在机场商店中消费航程积分。在使用FeliCa手机的用户中,60%的用户每周至少会使用一次支付功能。韩国首尔龙山驿高速铁路车站的电影院也应用了二维码来替代传统的售票方式。其具体做法是,观众用手机到电影院的网站上下载储存有座位号等信息的二维码,在进入电影院时只需将手机二维码扫入读码器即可入场,票款再通过移动支付的方式扣除,完全实现了无纸化作业。二维码的识读应用:识读应用也是二维码的重要应用之一,主要用于平面介质上。消费者可以利用照相手机内建的读码软件,轻轻对准平面杂志或是海报上的二维码一拍,就可以将二维码图形立即转化为文字,或是连接到相关网址,更方便地实现手机上网或内容下载。2003年,日本电信运营商KDDI首先推出手机二维码业务。比如,在一张CD或者DVD光盘上,通过手机识别二维码来了解光盘的内容;在旅游景点配合GPS快速定位等。其后不久,韩国与中国台湾也开始陆续推出自己的手机条码业务。现在,在日本、韩国和中国台湾,手机条码已经随处可见。除了杂志和报纸,二维条码还被印在名片、户外广告牌、优惠券和产品包装等介质之上。在二维码的识读应用方面,韩国做得也比较成功,他们在大学的图书馆中就安装了读取二维码信息的读码器。学生进入图书馆时,只需打开手机,调出手机上存储的二维码,然后将手机屏幕靠近读码器,便可将个人信息传到图书馆的电脑中进行身份识别,识别无误就可以进入图书馆,整个过程只需要几秒钟。这种二维码识别方式已经替代了原先必须检验学生证的传统方式。此外,图书馆借阅厅的电脑系统也与二维码读码器实现了连接。学生只要将手机上用于身份识别的二维码扫入读码器,便可在旁边的电脑上查阅自己的图书借阅情况。防伪功能:二维条码具有多重防伪特性,它可以采用密码防伪、软件加密及利用所包含的信息如指纹、照片等进行防伪,因此具有极强的保密防伪性能。在韩国的大学中,为了杜绝冒充别人出勤,学校专门在教室中安装了读取二维码信息的读码器。每个学生在进入阶梯教室时,都需要用储存有个人信息二维码的手机或磁卡进行扫码。然后,教师即可根据这些信息得知学生的出勤情况。由于每个人的二维码都具有唯一性,因此这种方式有效杜绝了冒充别人出勤。手机二维码市场现状从全球的二维码市场来看,亚洲发展最好,目前亚洲地区已经有7个国家、地区开始提供二维码业务(如表2所示)。而日本、韩国两国最好,截至2006年日本已经有6000万用户使用二维码,对二维码的认知度已经高达96%,在NTTDoCoMo推出的手机中将有超过90%具有二维码识别功能。韩国也达到近2000万用户,而且新出厂的手机90%都带着扫码工具。日本是最早开始使用二维码的国家。目前市场上已有很成熟的QR手机二维码市场应用,QR条形码在日本得到相当规模的应用,日本的海报、游览手册、传单、折扣券、电子票证,甚至连树上都贴着二维码,成为日本手机用户登录网站以及获得广告商品信息的非常便捷的方式。近几年来,日本二维码手机市场的占有率在逐年上升,从2002年的0.8%上升到了2005年的52.6%,2006年日本二维码手机市场占有率达到70%左右,如图1所示。日本手机二维码的运营模式是开放的,二维码扫描是手机上的一项功能,而不是运营商提供的一种服务。二维码的技术商将解码软件提供给运营商后,按手机的装机量收取版权费,运营商则将软件的解码完全公开,用户可以进行任意编码。DM码是韩国主流的二维码标准。截至2006年,韩国的二维码用户普及率已高达50%左右,韩国的二维码运营模式被证明是成功的模式。韩国的铃声下载和游戏已成最热门DM读码服务。如今,许多的游戏厂商和内容提供商,每天都会在报纸上刊出不同服务的二维条码,让消费者更快去找到使用的内容。韩国的二维码运营模式也是由运营商主导的,但是与日本不同的是,韩国的二维码专利权益是推动该市场的主要动力。各个电信运营商为了争取到更多的权益,都开发了自己的码制,虽然这样的模式会推动韩国二维码的快速发展,但这种模式使二维码的竞争更加激烈,可能会给市场的大规模推广造成困难。
在欧洲,DM二维码已在德国、乌克兰、奥地利、瑞士、意大利等国家应用,特别时足球赛门票销售已经广泛使用手机二维码购买电子票。英国已计划在2010年推出手机二维码登机牌。届时乘客不需要机票和登机牌,只要用手机上的登机二维码扫描即可登机。1.3研究内容系统主要分为两个大的模块:二维码的生成和二维码的识别。二维码的生成主要就是基于Winnows上的开发工具Netbeans开发,而同时又开发一个在Android平台下的二维码生成。而二维码的识别主要就是基于Android平台来开发,主要就是运用AndroidSDK和Eclipse共同开发,但是环境需要搭建。本系统研究主要包括以下内容:要分成生成和识别两大部分。识别功能主要就是对二维码和条形码的识别。主要就是通过手机的摄像头对二维码或者是条形码进行扫描,然后把把扫描到的二维码或者是条形码送到后台进行解析,如果解析成功后,就不再进行扫描。如果解析不成功,就会在进行扫描采集图像,在传到后台解析,直到能够识别图像为止。生成功能主要就是对二维码的生成。而生成这个功能可以在电脑上运行生成,也可以在手机上运行生成。二维码的生成主要支持名片、短信、文本、电子邮件及网络书签的生成。当用户选择好多要生成的对象时,就会把用户输入的信息送到后台,通过调用解析包,来生成还有相应信息的二维码。第二章开发环境二维码的生成主要设计的是在电脑上运行的桌面程序。通过在电脑上开发一个Java程序来生成二维码。其开发环境主要如下表表1Windows平台上开发使用的环境需求名称平台及工具开发工具Netbeans优化工具Photoshop开发语言Java运行环境WindowsXP+JDK测试环境WindowsXP+JDK二维码的识别和生成是在Android平台上的开发的,并使用EclipseIDE工具进行开发的。EclipseIDE安装ADT插件搭建了很好的Android开发平台,方便与编程。至于识别的功能要用到摄像头,虚拟机上面是没有摄像头的,这就需要有真机进行二维码的识别测试。Android平台开发环境如下表:Android平台开发使用的环境:需求名称平台及工具开发工具Eclipse、AndroidSDK、测试机优化工具Photoshop开发语言Java运行环境Android平台测试环境Android平台2.1Android开发平台2.1.1Android平台的组成Android不仅是一种用于移动终端设备的操作系统,更是一个开源的体系架构。它大量应用了开源社区的各项成果,并针对移动设备进行了充分优化。Android系统主要包含以下功能组件[16]:(1)经Google针对移动设备裁剪和优化的Linux内核;(2)由Google重新实现的Java虚拟机DalvikVM;(3)大量的函数库和服务,如浏览器引擎WebKit,数据库SQLite;(4)常用的应用程序,如拨号程序和通讯录等;(5)一套完整的SDK(SoftwareDevelopmentKit),提供了使用Java语言进行Android应用开发的API类库和工具集(包括Android模拟器和EclipseIDE下的开发工具插件以及一组用于在模拟器和终端设备上打包、安装、调试和测试应用程序的工具);(6)经过优化的轻量级2D和3D图形引擎,用于支持各种游戏的开发;(7)提供常见音频、视频和图片格式支持的底层多媒体库;(8)用于支持GSM蓝牙、3G、WiFi、摄像头、GPS和各种输入设备的驱动。2.1.2Android系统的架构Android操作系统自顶向下分为4层,分别为应用层、应用框架层、函数库和虚拟机层以及内核层[17],结构框架图如图2-1所示:图2-1Android系统架构(1)应用层(Application)这是架构的最上面一层,开发者可以用Java语言来开发各种富有创意的应用程序。应用层提供了一系列核心应用程序,包括邮件客户端、SMS(短信)、日历、Google地图、Web浏览器(Browser)和通讯录(Contacts)等。这一层所有(包括开发人员自己开发的)应用程序都是使用Java语言编写的。值得一提的是,这些应用程序可以同时执行,比如用户可以一边听音乐一边阅读邮件。(2)应用框架层(ApplicationFramework)这层包含了各种组件,并且这些组件具有可重用性及可替换性。Android应用框架为开发人员方便地编写,该平台的应用程序提供了标准的结构和功能组件。借助于应用框架,应用程序可以方便和安全地访问系统功能和其他应用程序所公布的功能,也可以公布自己的功能供其他应用程序使用。应用框架主要提供了以下组件和服务:=1\*GB3①丰富及可扩展的视图(Views):即一系列用于构建友好用户界面的可视化对象或控件,如列表、文本框、按钮和菜单等。=2\*GB3②内容提供器(ContentProviders):为应用程序提供数据或实现应用程序间数据的共享。=3\*GB3③资源管理器(ResourcesManager):提供对非代码资源的访问和管理,包括字符串、图形和界面布局等。=4\*GB3④通知管理器(NotificationManager):使应用程序可以在不中断用户的情况下通知用户特定的事件。如音乐播放器在后台运行时,可以在状态栏通知用户当前正在播放的歌曲名称。=5\*GB3⑤活动管理器(ActivityManager):管理应用程序的生命周期,并提供导航回退功能。=6\*GB3⑥位置管理器(LocationManager):使应用程序可以访问移动设备的当前地理位置信息,从而实现类似GPS导航的功能。(3)函数库层(Libraries)Android包含了一套C/C++函数库,用以支持操作系统为应用程序提供的所有功能,主要包括SurfaceManager、MediaFramework、WebKit、SGL、FreeType、SQLite等。这些函数库通常由移动设备生产商编译为针对特定硬件平台的内部机器码,安装在相应的移动设备中。应用程序不能直接使用这些函数库,必须借助于应用框架组件和API间接地访问这些底层函数库的功能。(4)运行时环境(Runtime)Android运行时环境由Java核心库和Dalvik虚拟机构成。Dalvik虚拟机是Google针对移动设备对Java虚拟机的重新实现,可支持多个虚拟机实例的高效运行。每个Android应用程序都拥有自己的进程空间和一个独立的虚拟机实例,因此,Android可以高效地同时运行多个应用程序。Dalvik虚拟机执行后缀为.dex的可执行文件,这是一种专门针对小内存设备优化了的文件格式。同时,Dalvik虚拟机是基于寄存器来实现方法调用的,所有类都由Java编译器编译(.calss文件),然后通过AndroidSDK中的dx工具转换为.dex格式。Dalvik虚拟机借助于Linux内核来实现线程和内存的管理。(5)Linux内核层(LinuxKernel)Android基于Linux2.6内核来提供操作系统的核心服务,如进程管理、内存管理、安全机制、网络通信和驱动模型。内核也作为硬件和其余软件栈之间的一个抽象层。2.1.3Android系统的应用程序组件要进行基于Android系统的移动应用程序的开发,开发人员需要熟悉以下几个基本组件[18]:活动(Activity)活动是构成Android应用程序的最常用组件,用来表示一个用户界面,类似于Windows应用程序中的窗口和对话框。活动在视图(View)类的协助下为应用程序提供用户界面(UI)。视图类可实现和包含各种UI元素,如文本框、便签、按钮和其他UI元素。一个应用程序可包含多个活动来提供多个用户界面。应用程序可以调用startActivity()或者startSubActivity()方法来开始一个新活动或切换到另外一个活动,方法的参数是一个Intent(意图)对象,然后由操作系统决定哪个活动最能满足指定的Intent。意图(Intent)Intent是Google引入的一个全新的应用程序设计元素,来描述用户期望执行或完成的特定动作(Action),如“选择一张图片”、“输入一段文字”、“拍摄一张照片”等。可以将Intent看作是一个消息,以表示应用程序间的一个功能请求,这可以有效地复用现有应用程序的功能,显著地提高应用程序的开发效率。如当用户使用邮件客户端编辑邮件的过程中需要插入一张图片时,邮件客户端程序无须自己实现该功能,只需要创建一个Intent对象表示“选择一张图片”这一意图,然后将其作为参数调用startActivity()即可,操作系统就会使用系统上安装的图片浏览程序供用户浏览和选择图片。一个应用程序可以通过向操作系统注册IntentFilter来声明自己有能力或者有兴趣执行特定的请求或Intent。(3)服务(Service)服务就是运行于“后台”的任务,不直接与用户交互,因此没有用户界面。服务的生命周期要比活动(Activity)长,可长时间地运行。典型的应用场景是,用户在音乐播放器的用户界面中选择并播放歌曲后,便离开了该界面(Activity被终止)去阅读邮件,但他希望在阅读邮件的过程中,能同时听音乐。这种情况下,负责音乐播放任务那部分代码就应该在运行于服务中。(4)内容提供者(ContentProvider)ContentProvider提供了一种多个应用程序共享和访问数据的抽象机制。将对数据的访问抽象为ContentProvider可以有效地控制多个应用程序对数据的读写操作,避免访问冲突,提高数据的安全性。Google提倡开发人员将需要共享的数据通过编写相应的ContentProvider供其他应用程序访问,而不是将这些数据直接公开。2.1.4Android系统的应用程序举例在了解Android系统的组成、架构以及应用程序组件之后,接下来我们创建一个Android程序,进一步了解这个系统。本次设计中的程序都是应用Java语言编程,使用EclipseIDE来进行来开发,并且在Android模拟器(AVD)上测试的,这个模拟器兼容AndroidSDKStarterPackage中的AndroidPlatform的版本(开发环境为AndroidSDK2.3.3)。本节首先新建一个Android项目,并新创建一个HelloWorld程序,利用Android模拟器来运行程序。打开EclipseIDE后,启动AVD(AndroidVirtualDevices),运行画面就如同真的手机开机操作一样,如图2-2(a)所示,开机之后,随即打开创建好的“HelloWorld”程序,如图2-2(b)所示。(a)(b)图2-2已创建的“HelloWorld”程序要退出被打开的被打开的“HelloWorld”程序,可以按下手机模拟器上的退格键,如图2-3所示。图2-3按下退格键离开程序,回到手机的桌面虽然程序没有写,但向导却已经帮着写好了程序进入点、布局配置和应用程序访问权限等,为第四章的设计做好了准备工作。2.2开发工具(Eclipse、AndroidSDK、)JavaJDK下载:进入该网页:
/javase/downloads/index.jsp
(或者直接点击下载)如下图:选择DownloadJDK只下载JDK,无需下载jre.安装完成后,进入我的电脑->高级->环境变量->在JAVA_HOME的变量,值为:C:\...\java\jdk1.6.(不是JRE的路径).在新建classpath的变量,值为:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tool.jar修改原有path变量,在最后面增加:;%JAVA_HOME%\bin(%之前的分号需要)下载AndroidSDK下载地址:/sdk/index.html下载版本:Android-sdk_r12-windows下载完成解压缩后运行SDKManager.ExeSDKManager.Exe会自动更新然后列出可安装的程序补丁,请选择以下补丁安装AndroidSDKPlatform–tools,revision6(必须选择)SDKPlatformAndroid2.2,API8,revision3(必须选择,模拟器速度不错)SDKPlatformAndroid3.2,API13,revision1(最新版,但是模拟器速度不是一般的慢)(左边Packages项目需要安装的变为状态,不需要安装的变为状态)下载完成后把SDK的路径添加到环境变量的path中:(我的电脑->高级->环境变量->path);C:\...\Android\android-sdk(C:之前的分号需要)下载Eclipse:下载地址:/downloads/下载版本:EclipseIDEforJavaEEDevelopers,212MBEclipse配置AndroidEclipse配置安卓插件:help->InstallNewSoftWare出现如下界面:点击Add按钮,出现如下界面:输入url地址/android/eclipse/,并名称为Android,点击ok将出现下图:点击next按钮,将出现下面界面:继续点击next按钮,将出现下面界面:选择Iacceptthetermsofthelicenseagreements点击Next,进入安装插件界面:安装完成后出现下面界面,重启eclipse就可以了。配置AndroidSDK最后配置SDK与Eclipse的关联,打开Eclipse选中左边菜单的Android然后SDK的路径,然后,最后OK。到此配置全部结束配置工作AVDAndroidSDKManager配置,打开SDKManager.ExeNew新建一个AVD点击next出现下面界面:(其中个人认为Skin选择HVGA模拟器大小比较合适开发用)然后选中新建的模拟器,点击就可以运行模拟器了(启动稍慢,启动后不要关闭,在Eclipse中运行程序就会在模拟器中执行,程序内容变化也不需要反复启动模拟器)第三章二维码的生成3.1QRcode的简介本次设计的二维码是以QRCode二维码为例,所以在设计之前,我们先对QR码进行简单的介绍。3.1.1QRCode的结构与特性QRCode(QuickResponseCode),称为快速响应矩阵码[27],是由日本Denso公司于1994年开发的一种矩阵式二维码,它具有二维条码的共同特点,如存储信息量大,可靠性高,可表示汉字、图像和音频等多种数据类型的信息之外,还具有以下特点:(1)超高速识读超高速识读特点是QR码区别于其它二维条码的一个主要特性。使用条码识读设备识读条码时,一秒钟可以识读30个含有100个字符的QR码符号;对于含有相同数据信息的PDF417条码,一秒钟只能识读3个符号;对于DataMatrix,一秒钟最多可以识读3个符号。(2)全方位识读QR码具有全方位(360度)识读的特点,这是QR码又一个主要优点。在识别QR码的过程中要先将具有一定的角度的QR码作旋转处理,使其四条边界与坐标轴平行垂直,然后根据QR码的三个位置探测图形对其进行识别。(3)可以高效表示汉字由于日本的文字中也存在着大量的汉字,因此QR码在其设计的过程就已经实现了对汉字的支持。QR码能够用特定的数据压缩模式表示中国汉字和日文,当表示汉字时QR码仅用13位二进制数据就足够了,而其他二维条码只能够用字节表示模式来表示汉字,需用16位二进制数据(即两个字节)表示一个汉字,所以QR码的汉字表示容量超出其他二维条码20%。a、QRCode的结构QR的编码规范参见文献[28],其编码符号结构见图4-1,它包括编码区域和功能区域(包括探测图形、分割符、定位图形和校正图形)。(1)探测图形它包括三个位置的探测图形,分别位于符号的左上角、右上角和左下角,如图4-1所示,每个位置探测图形由三个同心的正方形组成,分别为7×7个深色模块、5×5个浅色模块、3×3个深色模块。由于有掩模的作用,符号中其他地方遇到类似图形的可能性极小,所以探测图形可以用来识别QR码符号,并可确定条码的位置和方向。图4-1QR码的符号结构(2)定位图形水平和垂直定位图形分别为一个模块宽,由深色与浅色模块交替组成的一行和一列图形,它们的位置分别位于第6行与第6列。作用为确定符号的密度和版本,为模块坐标位置作参考。(3)校正图形每个校正图形可看作是三个同心的正方形,由5×5深色模块,3×3浅色模块和一个中心深色模块构成,校正图形的数量视版本而定。b、QRCode的基本特性,见表4-1表4-1QRCode的基本特性符号尺寸21×21模块(版本1)~177×177模块(版本40)可编码字符集及容量·数字型数据:7089个字符·字母数字型数据:4296个字符·8位字节型数据:2953个字符·中国汉字字符及日本汉字字符:1817个字符数据表示方法深色模块表示二进制“1”,浅色模块表示二进制“0”纠错能力采用Reed-Solomon纠错,纠错等级分为L级(纠错7%)、M级(纠错15%)、Q级(纠错25%、H级(纠错30%)附加特性结构链接:允许最多16个QR码在逻辑上连续表示一个数据文件掩模:使得因相邻模块造成译码困难的可能性减为最小扩充解释:可以进行针对编码我国于2000年发布了QR码的国家标准,随着QR码在各领域的推广和智能手机的快速发展,如何在智能手机中较好地识别QR码是一项值得研究的课题,本章将主要讨论在Android平台下产生以及识别QR码。3.1.2QRCode的标准在上节中介绍了QRCode的结构与特性,它是一种矩阵型二维码的符号,具有存储信息容量大、可靠性高、超高速全方位识读的特点,可表示汉字、图像等多种类型信息,并由于其用特定的数据压缩模式表示中国汉字和日本汉字,在亚洲地区如中国、日本、韩国,应用得最为广泛。为了使QRCode的应用在中国标准化,中国物品编码中心制定了快速响应矩阵码国家标准GB/T18284-2000,neqISO/IEC18004:2000。该标准是对ISO/IEC18004标准进行了取舍和补充完善。如:用中国汉字数据表示模式代替了ISO/IEC18004中日文表示模式的内容。3.1.3QRCode的编码及译码过程(1)编码过程QRCode的编码流程图如图4-2所示:图4-2QRCode的编码流程图①得到用户输入数据,进行数据分析分析输入的数据流,确定要进行编码的字符类型,确定用户选择的纠错等级(如果没有则选择默认等级),根据纠错等级和数据容量,选择与数据相适应的最小编码版本。②数据编码按照所选择模式的编码标准,将数据字符转换为位流。在数据位流前加上模式指示符,在数据位流之后加上终止符,将产生的位流分为每8位一个码字,必要时加入填充字符以填满按照版本所要求的数据字数。③纠错编码按标准要求将码字序列分块,以便生成相应的纠错码字。分段后的数据通过RS纠错电路,生成相应的纠错码字,并加入到相应的数据码字序列的后面。④构造最终信息按标准的数据排列方式构建最终排列信息,必要时加入剩余位。⑤在矩阵中标识功能模块不同的版本因要嵌入不同数量的校正图形,因此对应不同的矩阵排列。矩阵中要加入功能图形,首先要标识功能图形的位置,并在对应位置加入功能图形中的探测图形、分隔符、定位图形和校正图形。⑥在矩阵中布置数据模块按照排列标准,将数据码字模块放入矩阵中的对应位置。⑦加入掩模用8种掩模图形依次对符号的编码区域的位图进行掩模处理,评价所得到的8种结果,选择最优的一种。⑧加入格式和版本信息生成版本信息(版本7以上)和格式信息,构成符号,加入矩阵对应位置。⑨生成条码图形根据上面步骤得到的1、0矩阵,生成对应的黑白方块条码图形。(2)译码过程QRCode译码系统的文件读入有两种方式,一种是直接从图像文件(.bmp)读入,找到条码图像,进行译码;另一种是从QRCode的数据文件(.qr)读入条码信息,进行译码。本次设计采用的是第一种,所以这里介绍读入图像文件,进行译码。将图像文件读入,由于采集到的条码图像通常存在畸变、污染等,因此在定位条码前需要进行图像的处理,包括图像畸变校正、噪声去除、二值化和图像旋转等操作[29-31]。QRCode图像识别过程具体流程如图4-3所示:图4-3QRCode条码图像识别流程图解码的步骤和编码正好相反,步骤为:①提取格式信息,版本信息;②去掩模;③抽取数据信息和纠错信息;④RS纠错;⑥对纠错后的数据信息进行解码。有了纠错,图像的部分污染也能正确解出码来,大大提高了QRCode码的可识读性。3.2基于Android系统的QR码生成首先打开EclipseIDE后,输入有关QRCode生成的Java程序(主要程序见附录1)。QRCode二维码为ISO/IEC18004所规范,在网络上有许多开放的Library来进行编码范例,因此,在运行程序之前,先到下载forJava版本使用的库函数,并将文件名称更名为SwetakeQRCode.jar。此次设计有三个重点:①引用产生的QRCode二维码的SwetakeQRCode.jar函数库。②将User输入的字符串,利用SwetakeQRCode.jar函数库转成产生图片文件的二维数组,作为产生二维码的依据。③在SurfaceView上绘制二维码图片。此程序中自定义函数AndroidQREncode()有两个参数,分别位于编码的字符串以及要指定的QRCodeVersion(可接受0~40)。程序默认的QRCodeVersion为4,能接受62个字符,所以,若需要接受更多字符编码,则需要修改QRCodeVersion的数值。创建com.swetake.util.Qrcode对象testQrcode后,将ErrorCorrection设置为M(可接受L,M,O,Q等值),以及调用testQrcode.calQrcode()将其编码为二维boolean数组,自定义函数drawQRCode()则接受来自编码后的boolean二维数组,将其在SurfaceView上绘制出QRCode二维码。准备好应用程序之后,启动AVD,运行程序后,运行结果见图4-4(a)。单击“产生QRCode条形码”的按钮,则生成网址为“http://”的QRCode二维码,如图4-4(b)所示。(a)(b)图4-4运行结果上一个例子,生成的是一个网址的二维码,下面我们通过java变成生成任意功能的二维码,用户可以选择所要生成的二维码信息进行填写如图(a),如点击名片,输入姓名、职业、固定电话、移动电话,然后单击生成QR码,就会出现如(b)的画面,之后点击产生QR条形码就会出现我们想要的二维码,如图(c)所示。(程序见附表1)
(a)(b)(c)图4-5生成的二维码第四章二维码识别系统的实现二维码的识别主要是通过对摄像头的调用,启用多线程,对摄像头进行快速的回调应用,当一次回调的图像没有识别出来就进行下一次的回调,直到识别出二维码为止。同时由于对与二维码的大小不同,显示的模糊度不同等等原因,会使摄像头不能很好的采集图像,在这里要使摄像头能够进行自动对焦,从而使识别更快的实现。当识别完成以后就对用户进行提醒,对手机进行震动和播放声音,播放完成,显示识别出来的结果。本文使用ZXing1.6实现条码/二维码识别。ZXing是个很经典的条码/二维码识别的开源类库,longlongago,就有开发者在J2ME上使用ZXing了,不过要支持JSR-234规范(自动对焦)的手机才能发挥其威力,而目前已经有不少Android手机具备自动对焦的功能。4.1开源利器zxing.ZXing是一个开源Java类库用于解析多种格式的条形码和二维码.官网:HYPERLINK"/p/zxing/"/p/zxing/截止目前为止最新版本为1.7,提供以下编码格式的支持:UPC-AandUPC-EEAN-8andEAN-13Code39Code93Code128QRCodeITFCodabarRSS-14(allvariants)DataMatrixPDF417('alpha'quality)Aztec('alpha'quality)同时官网提供了Android、cpp、C#、iPhone、j2me、j2se、jruby、objc、rim、symbian等多种应用的类库,具体详情可以参考下载的源码包中。4.2基于zxing的二维码识别将完整的zxing程序包导入Eclipse软件,并模拟仿真,结果如图所示:(如图5-1)(a)zxing模拟器(b)解析成功页面图5-1zxing解析二维码随后将具有Android系统的手机与电脑相连,并点击下载程序,安装此系统,于是手机便可调用此程序调用摄像头扫描识别二维码。本文代码运行的结果如下,使用91手机助手截图,得到所识别的二维码:(如图5-2所示)图5-2二维码识别4.3源码系统分析本文使用了ZXing1.6的core,即把/zxing-1.6/core/下的src复制覆盖工程的src;另外还要使用到/zxing-1.6/android/下的PlanarYUVLuminanceSource.java。PS:/zxing-1.6/android/是BarcodeScanner的源码,本文程序相当于BarcodeScanner的精简版,只保留最基本的识别功能。地址:/downloads349/sourcecode/comm/android/detail1521939.html源码目录结果如下图,ChecksumException.java下面还有很多源文件,截图尚未列出本文例子必须要开摄像头和自动对焦的权限,不然启动时会报异常,所用的权限如下:[xhtml]\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?<uses-permissionandroid:name="android.permission.CAMERA"></uses-permission><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><uses-featureandroid:name="android.hardware.camera"/><uses-featureandroid:name="android.hardware.camera.autofocus"/>main.xml源码如下,main.xml必须要用到FrameLayout才能重叠控件实现“范围框”的效果:xhtml]\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?<?xmlversion="1.0"encoding="utf-8"?><FrameLayoutandroid:id="@+id/FrameLayout01"android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="/apk/res/android"><SurfaceViewandroid:layout_height="fill_parent"android:id="@+id/sfvCamera"android:layout_width="fill_parent"></SurfaceView><RelativeLayoutandroid:id="@+id/RelativeLayout01"android:layout_height="fill_parent"android:layout_width="fill_parent"><ImageViewandroid:id="@+id/ImageView01"android:layout_height="100dip"android:layout_width="160dip"></ImageView><Viewandroid:layout_centerVertical="true"android:layout_centerHorizontal="true"android:layout_width="300dip"android:background="#55FF6666"android:id="@+id/centerView"android:layout_height="180dip"></View><TextViewandroid:layout_centerHorizontal="true"android:layout_width="wrap_content"android:layout_below="@+id/centerView"android:layout_height="wrap_content"android:text="Scanning..."android:id="@+id/txtScanResult"android:textColor="#FF000000"></TextView></RelativeLayout></FrameLayout>testCamera.java是主类,负责控制Camera和对图像做解码,源码如下:[java]\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?packagecom.testCamera;importjava.util.Timer;importjava.util.TimerTask;importcom.google.zxing.BinaryBitmap;importcom.google.zxing.MultiFormatReader;importcom.google.zxing.Result;importcom.google.zxing.Android.PlanarYUVLuminanceSource;importmon.HybridBinarizer;importandroid.app.Activity;importandroid.graphics.Bitmap;importandroid.hardware.Camera;importandroid.os.Bundle;importandroid.view.SurfaceView;importandroid.view.View;importandroid.widget.ImageView;importandroid.widget.TextView;publicclasstestCameraextendsActivity{/**Calledwhentheactivityisfirstcreated.*/privateSurfaceViewsfvCamera;privateSFHCamerasfhCamera;privateImageViewimgView;privateViewcenterView;privateTextViewtxtScanResult;privateTimermTimer;privateMyTimerTaskmTimerTask;//按照标准HVGAfinalstaticintwidth=480;finalstaticintheight=320;intdstLeft,dstTop,dstWidth,dstHeight;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);this.setTitle("Android条码/二维码识别Demohellogv");imgView=(ImageView)this.findViewById(R.id.ImageView01);centerView=(View)this.findViewById(R.id.centerView);sfvCamera=(SurfaceView)this.findViewById(R.id.sfvCamera);sfhCamera=newSFHCamera(sfvCamera.getHolder(),width,height,previewCallback);txtScanResult=(TextView)this.findViewById(R.id.txtScanResult);//初始化定时器mTimer=newTimer();mTimerTask=newMyTimerTask();mTimer.schedule(mTimerTask,0,80);}classMyTimerTaskextendsTimerTask{@Overridepublicvoidrun(){if(dstLeft==0){//只赋值一次dstLeft=centerView.getLeft()*width/getWindowManager().getDefaultDisplay().getWidth();dstTop=centerView.getTop()*height/getWindowManager().getDefaultDisplay().getHeight();dstWidth=(centerView.getRight()-centerView.getLeft())*width/getWindowManager().getDefaultDisplay().getWidth();dstHeight=(centerView.getBottom()-centerView.getTop())*height/getWindowManager().getDefaultDisplay().getHeight();}sfhCamera.AutoFocusAndPreviewCallback();}}/***自动对焦后输出图片*/privateCamera.PreviewCallbackpreviewCallback=newCamera.PreviewCallback(){@OverridepublicvoidonPreviewFrame(byte[]data,Cameraarg1){//取得指定范围的帧的数据PlanarYUVLuminanceSourcesource=newPlanarYUVLuminanceSource(data,width,height,dstLeft,dstTop,dstWidth,dstHeight);//取得灰度图BitmapmBitmap=source.renderCroppedGreyscaleBitmap();//显示灰度图imgView.setImageBitmap(mBitmap);BinaryBitmapbitmap=newBinaryBitmap(newHybridBinarizer(source));MultiFormatReaderreader=newMultiFormatReader();try{Resultresult=reader.decode(bitmap);StringstrResult="BarcodeFormat:"+result.getBarcodeFormat().toString()+"text:"+result.getText();txtScanResult.setText(strResult);}catch(Exceptione){txtScanResult.setText("Scanning");}}};SFHCamera.java是Camera控制类,源码如下:[java]\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?packagecom.testCamera;importjava.io.IOException;importandroid.graphics.PixelFormat;importandroid.hardware.Camera;importandroid.util.Log;importandroid.view.SurfaceHolder;publicclassSFHCameraimplementsSurfaceHolder.Callback{privateSurfaceHolderholder=null;privateCameramCamera;privateintwidth,height;privateCamera.PreviewCallbackpreviewCallback;publicSFHCamera(SurfaceHolderholder,intw,inth,Camera.PreviewCallbackpreviewCallback){this.holder=holder;this.holder.addCallback(this);this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);width=w;height=h;this.previewCallback=previewCallback;}@OverridepublicvoidsurfaceChanged(SurfaceHolderarg0,intarg1,intarg2,intarg3){Camera.Parametersparameters=mCamera.getParameters();parameters.setPreviewSize(width,height);//设置尺寸parameters.setPictureFormat(PixelFormat.JPEG);mCamera.setParameters(parameters);mCamera.startPreview();//开始预览Log.e("Camera","surfaceChanged");}@OverridepublicvoidsurfaceCreated(SurfaceHolderarg0){mCamera=Camera.open();//启动服务try{mCamera.setPreviewDisplay(holder);//设置预览Log.e("Camera","surfaceCreated");}catch(IOExceptione){mCamera.release();//释放mCamera=null;}}@OverridepublicvoidsurfaceDestroyed(SurfaceHolderarg0){mCamera.setPreviewCallback(null);mCamera.stopPreview();//停止预览mCamera=null;Log.e("Camera","surfaceDestroyed");}/***自动对焦并回调Camera.PreviewCallback*/publicvoidAutoFocusAndPreviewCallback(){if(mCamera!=null)mCamera.autoFocus(mAutoFocusCallBack);}/***自动对焦*/privateCamera.AutoFocusCallbackmAutoFocusCallBack=newCamera.AutoFocusCallback(){@OverridepublicvoidonAutoFocus(booleansuccess,Cameracamera){if(success){//对焦成功,回调Camera.Pr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 体育场地施工项目成本效益分析考核试卷
- 职业规划中的生涯危机处理策略考核试卷
- 区块链技术发展现状考核试卷
- 儿童心理健康与社区心理健康志愿服务体系构建考核试卷
- 惠农贷款管理办法
- 报废刀具管理办法
- 打磨刀具管理办法
- 林场职工管理办法
- 村寨消防管理办法
- 杨树小苗管理办法
- 广东省广州市2024届高三上学期8月阶段训练数学试题
- 脑卒中后吞咽障碍患者进食护理(2023年中华护理学会团体标准)
- 中小学高级职称英语全英答辩题(二)
- 护士执业注册申请表 新
- 新人教版七年级英语上册预备篇1―3单元测试卷
- 哈萨克斯坦劳动法中文版
- 水利混凝土试块强度计算评定表
- 草皮购销合同
- 急危重症护理(高职)PPT完整全套教学课件
- 造口及造口周围并发症的处理课件
- 药品生产企业短缺药品停产报告管理规程
评论
0/150
提交评论