XXXX
本科生毕业设计(论文)
学院(系): XX
专 业: XX
学 生: XX
指导教师: XX
XX
完成日期 年 月
XXX本科生毕业设计(论文)
基于Android的二维码识别系统的研究
与实现
Research and Implementation of QRcode Recognition System Based on Android
总 计:毕业设计(论文) 31页
表 格: 5个
图 片: 20个
XXXXX 本 科 毕 业 设 计(论文)
基于Android的二维码识别系统的研究
与实现
Research and Implementation of QRcode Recognition System Based on Android
学 院(系): XXX
专 业: XXX
学 生 姓 名: XXX
学 号: XXX
指导教师(职称): XXX
指导教师(职称): XXX
评 阅 教 师: XXX
完 成 日 期:
基于Android的二维码识别系统的研究
与实现
软件工程 XXX
一维条码在生产和生活的各个方面得到了广泛的应用,极大的提高了生产率,但是一维条码本身的缺点:信息量小、依赖数据库等也日益的现露出来。二维条码本身具有高容量、高密度、纠错能力强、安全强度高等特点,使得二维条码作为信息的载体在信息自动化领域发挥着越来越重要的作用。QR码作为快速响应二维码,以其独特的优势,在汉语国家发展迅速。目前,国内QR码的识别大多是基于PC的,而且对于光照不均、背景较复杂的二维码图像,其识别速度和准确度也有待提高。另外,Android平台上当前流行的二维码识别软件普遍存在着扫描速度慢,需要精确对焦等缺点,而且大都是由国外开发。鉴于此,深入研究QRCode码的准确与快速识别算法及其在Android手机平台上的软件实现具有十分重要的意义。本课题分析研究QRCode二维码编解码原理与图像预处理算法,根据Android嵌入式平台的特点,设计出一种嵌入式设备中的QRCode二维码别软件,具有很强的实用性。本文首先分析研究了QR码结构的基本特征、编解码理论、RS纠错算法和二维码图像预处理算法,然后在当前预处理算法的基础上,基于QR码图像的特点,进行程序的编写。课题利用Android平台,设计出一套QR码的识别系统,系统首先在模拟器中运行,然后下载到手机中进行测试。最后论文给出了测试结果。
Android;条码;二维码;识别
Research and Implementation of QRcode Recognition System Based on Android
Software Engineering MajorXXX
One-dimension barcode is widely used recent years in all aspect of life, which greatly improved the productivity. However, the faults of 1-D barcode have become increasingly apparent, the information storage of it is so little, and also it must be rely on database. Two-dimension barcode has the characteristics of high capacity, high density, high security and good error correction ability, which make it play more and more important role in information and automation field. QRCode(Quick Response Code), as a 2-D barcode, develops rapidly in Chinese speaking countries with its unique advantages. At present, in our nation, recognition of QRCode mostly bases on PC, and especially for QR image with uneven illumination or complicated background, the recognition speed and accuracy are not so good. Moreover, the popular barcode recognition software on android platform has some shortcomings prevalently, such as slow speed of recognition, etc. This article studies the QRCode codec theory and barcode image preprocessing algorithms, and then puts forward some optimization algorithms based on embedded android mobile phone system, and designs a QRCode recognition system. At first, this thesis makes a deep research on QRCode features, codec theory, RS error correction algorithm and 2-D barcode image preprocessing algorithms. And then in the current pretreatment algorithm, and on the basis of the characteristics of the QR code based on image, the writing of the program. Then, a QRCode recognition system is implemented on Android platform. This system firstly is tested on emulator and then downloaded on HTC mobile phone. At last, thesis gives the test results.
Android;Barcode;Two-dimension code;Recognition
目 录
1 Android系统开发背景与意义11
1.1 Android系统平台的出现11
1.2 Android系统的发展11
1.3 Android系统架构的介绍11
1.4 Android开放系统33
1.5 Android系统的特点33
2 二维码识别系统背景介绍33
2.1 二维码识别系统背景33
2.1.1 二维码技术产生的背景33
2.1.2 二维码分类及其特点44
2.1.3 二维码技术国内外的发展55
2.2 二维码技术研究的意义和应用66
2.2.1 二维码技术的应用66
2.2.2 二维码研究的意义77
3 需求分析88
3.1 系统需求分析88
3.1.1 课题可行性分析88
3.1.2 课题功能需求分析99
3.1.3 课题功能需求分析说明99
3.1.4 系统界面需求99
3.1.5 系统性能需求99
3.1.6 运行环境需求99
3.2 系统需要解决的问题99
3.3 系统关键技术分析1010
3.4 本章总结1010
4 系统设计1010
4.1 课题需要解决的问题1010
4.1.1 界面布局1010
4.1.2 条形码二维码解码功能1010
4.2 系统总体设计1111
4.2.1 课题功能框架1111
4.2.2 课题总体流程图1212
4.2.3 数据库的概念结构设计1313
4.3 系统详细设计1313
4.3.1 系统模块设计1313
4.3.2 系统界面详细设计1616
4.3.3 数据库详细设计1616
4.4 本章小结1717
5 编码与实现1717
5.1 开发环境搭配1717
5.1.1 软件下载安装1717
5.1.2 配置环境变量1717
5.2 二维码识别系统功能实现1717
5.2.1 二维码识别系统界面设计1717
5.2.2 二维码功能的设计与实现1919
5.2.3 查看扫描历史记录功能实现2121
5.2.4 分享功能实现2222
5.3 本章小结2222
6 系统测试与运行2222
6.1 测试目的2222
6.2 测试环境2323
6.3 测试的流程和测试2323
6.3.1 基于Android模拟器的运行测试2323
6.3.2 基于Android移动设备的运行测试2424
6.4 本章小结2727
结束语2828
参考文献2929
附录3030
致谢3131
Android系统开发背景与意义
Android系统平台的出现
Android操作系统最初是由Andy Rubin开发,最初主要支持手机。2005年由Google收购注资。并组建开放手机联盟开发改良,后来Google公司进军移动领域,逐渐扩展到平板电脑及其他领域上。直到2007年11月5日,谷歌公司正式向外界展示了这款名为Android的操作系统,并且在这天谷歌宣布建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成。这一联盟将支持谷歌发布的手机操作系统以及应用软件,并共同开发Android系统的开放源代码。这一开放平台后来被人们称之为“Android工程”。
第一款搭载 Android 系统的手机是 2008 年 9 月由 T-Mobile 发布的 G1,它拥有 GPS 功能,3.1M 摄像头,以及一系列的 Google 应用。G1 的面市,正式拉开了 Google 以及整个移动业界激动人心的大冒险的序幕,Android系统这才真正进入智能手机舞台。
Android系统的发展
随着Android平台的推出到现在的普遍推广,其发展的速度可以称之为神速。从最初的平台的发布,许多的手机巨头都看到了Android的巨大前景并纷纷加入Android平台的研究与开发。后来随着Android各版本的相继发布及其开放性,Android越来越受欢迎。
随着Android2.0智能手机操作系统的正式发布,Android已经相当的火热。随后Google相继宣布与雅虎、亚马逊等知名公司合作。截止到2012年,Google相继发布了android系统的一系列版本,每个新的版本不但向下兼容,而且也提供了新的功能,系统更加稳定。到2011年第一季度,Android在全球的市场份额首次最超越塞班系统,跃居全球第一。2012年2月数据,Android占据全球的智能手机操作系统市场的52.5%的份额,中国占有率为68.4%[1]。
Android系统架构的介绍
Android操作系统是一个开源的软件平台,基于Linux 内核,定义并实现了一套系统服务框架和图形用户接口。Android操作系统组成如图1-1所示:
图1-1 Android系统架构
从软件的角度来看,Android平台由Linux内核、系统库、Android运行时、应用程序框架以及应用程序共5部分构成。
(1) Linux 内核(Linux Kernel),主要也就是操作系统的内核框架和硬件驱动。这也是Android平台的开放性、安全性的基础。所示就是Linux内核层为我们在软件层和硬件层建立的抽象层,如下图1-2所示:
图1-2 Android系统内核
(2)Android的系统库(Libraries),主要采用C/C++语言编写,为Android系统服务提供一些底层实现和一些函数库。
(3)Android运行时(Android Runtime),主要就是提供一个Android虚拟机和虚拟机运行的一些类库。
(4)应用程序框架(Application Framework),主要实现Android的系统框架和GUI。应用程序框架层包含了视图系统、内容提供器、窗口管理器、活动管理器、通知管理器、位置管理器、资源管理器、电话管理器和包管理器9大部分,如图1-3所示:
图1-3 Android应用框架
(5)应用程序(Applications),主要就是包含Android的一些常用的应用程序。这些应用程序包括邮件、短信、日历、地图、浏览器、联系人管理程序等,而这些程序也是基于Java程序语言编写的。
Android开放系统
我们可以从上面内容中可以发现Android是一个包括操作系统、中间件和关键应用的移动设备软件堆。Google的Android系统是一个完全开放的系统,也是一个完整的生态系统,分成了三个有机个体。
源代码工程Open Source Project
开发应用 Developer
市场 Market
Android系统的特点
由于android系统的这三个有机个体的综合应用,Android系统具有5大特点:
(1)开放性
(2)应用程序无界性
(3)平等条件创建应用程序
(4)轻松嵌入网络
(5)并行运行
正是由于Android系统的这些特点,才使得Android系统有了如今的发展[2]。
二维码识别系统背景介绍
二维码识别系统背景
二维码技术产生的背景
条码技术自20世纪70年代初问世以来,发展十分迅速,仅仅20年时间,它已广泛应用于商业流通、仓储、医疗卫生、图书情报、邮政、铁路、交通运输、生产自动化管理等领域。条码技术的应用极大地提高了数据采集和信息处理的速度,改善了人们的工作和生活环境,提高了工作效率,并为管理的科学化和现代化做出了重要贡献。
二维条码技术是在一维条码无法满足实际应用需求的前提下产生的。由于受信息容量的限制,一维条码通常是对物品的标识,而不是对物品的描述。所谓对物品的标识,就是给某物品分配一个代码,代码以条码的形式标识在物品上,用来标识该物品以便自动扫描设备的识读,代码或一维条码本身不表示该产品的描述性信息。
因此,在通用商品条码的应用系统中,对商品信息,如生产日期、价格等的描述必须依赖数据库的支持。在没有预先建立商品数据库或不便联网的地方,一维条码表示汉字和图像信息几乎是不可能的,即使可以表示,也显得十分不便且效率很低。
随着现代高新技术的发展,迫切需要用条码在有限的几何空间内表示更多的信息,以满足千变万化的信息表示的需要[3]。
二维码分类及其特点
二维码可以分为堆叠式/行排式二维条码和矩阵式二维条码。堆叠式/行排式二维条码形态上是由多行短截的一维条码堆叠而成;矩阵式二维条码以矩阵的形式组成,在矩阵相应元素位置上用“点”表示二进制“1”, 用“空”表示二进制“0”,由“点”和“空”的排列组成代码。
堆叠式/行排式二维码
堆叠式/行排式二维条码(又称堆积式二维条码或层排式二维条码),其编码原理是建立在一维条码基础之上,按需要堆积成二行或多行。它在编码设计、校验原理、识读方式等方面继承了一维条码的一些特点,识读设备与条码印刷与一维条码技术兼容。但由于行数的增加,需要对行进行判定,其译码算法与软件也不完全相同于一维条码。有代表性的行排式二维条码有:Code 16K、Code 49、PDF417等。其中的CODE49,是1987年由 David Allair 博士研制,Intermec 公司推出的第一个二维码。
矩阵式二维码
短阵式二维条码(又称棋盘式二维条码)它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。矩阵式二维条码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。具有代表性的矩阵式二维条码有:Code One、Maxi Code、QR Code、Data Matrix等。除了这些常见的二维码之外,还有Vericode条码、CP条码、Codablock F条码、田字码、 Ultracode条码,Aztec条码。下图列举了国内外二维码制及符号。下图2-1列举了国内外二维码制及符号。
图2-1二维码分类
二维码技术国内外的发展
国外对二维码技术的研究始于20世纪80年代末,已研制出多种码制,全球现有的一维码、二维码多达250种以上,到目前二维码已经是一项非常成熟的技术,其中常见的有PDF417,QRCode,Code49,Code16K,CodeOne等20余种,并有许多国家开始应用这项技术。二维码技术标准在全球范围得到了应用和推广。美国讯宝科技公司(Symbol)和日本电装公司(Denso)都是二维码技术的佼佼者。
在当今生活中我们经常见到一维条码,二维条码的应用还刚刚起步,随着带摄像头的智能手机普及,二维条码的应用渐渐来到我们的日常生活中。手机二维码的技术是指以二维码标准为核心,将手机作为载体,而展开的码制编码、译码、识别、被识别相结合的综合性技术。在众多的二维码技术标准中,QR(Quickly Response)码与DM(Data Matrix)码应用最为广泛。
DM码产生于1989年,包括NASA、USDoD两种标准。DM码主要采用了复杂的纠错码技术,使得该编码具有超强的抗污染能力。目前DM码在韩国市场上属于手机二维码的主流技术。
QR码是由日本Denso公司于1994年研制的一种矩阵二维码符号,该二维码已经成为日本主流的手机二维码技术标准,它的最大特点就是可高效地表示汉字。日本是最早开始使用二维码的国家。目前市场上已有很成熟的QR手机二维码市场应用,QR条形码在日本得到相当规模的应用,日本的海报、游览手册、传单、折扣券、电子票证,甚至连树上都贴着二维码,成为日本手机用户登录网站以及获得广告商品信息的非常便捷的方式。近几年来,日本二维码手机市场的占有率在逐年上升,从2002年的0.8%上升到了2005年的52.6%,2006年日本二维码手机市场占有率达到70%左右。日本手机二维码的运营模式是开放的,二维码扫描是手机上的一项功能,而不是运营商提供的一种服务。二维码的技术商将解码软件提供给运营商后,按手机的装机量收取版权费,运营商则将软件的解码完全公开,用户可以进行任意编码[4]。
在我国,GM 《二维码网格矩阵码(GM)》SJ/T11349-2006和CM《二维码紧密矩阵码(CM)》SJ/T11350-2006标准是由原国家信息产业部于2006年5月25日所颁布的两项国产行业推荐标准。此两项标准于2006年5月30日起实施。
GM码其全称为网格码(Grid Matrix Code)是一种正方形的二维码码制,该码制的码图由正方形宏模块组成,每个宏模块由6乘6个正方形单元模块组成。网格码可以编码存储一定量的数据并提供5个用户可选的纠错等级。
CM码意为“紧密矩阵”,是英文Compact Matrix的缩写。码图采用齿孔定位技术和图像分段技术,通过分析齿孔定位信息和分段信息可快速完成二维码图像的识别和处理。
当前,我国二维码产业还处于成长期,总体来看,我国的条码标准体系尚显单薄,具有自主知识产权的二维码核心技术不多,二维码技术标准的应用和推广也存在一些困难。但是,各方面条件的逐渐成熟,正推动整个产业的发展提速。目前,几方面有利因素是我国二维码产业发展的重要驱动力:首先,二维码自身的优势和价值使将其在全球范围内得到更广泛更深入的应用。其次,作为物联网产业的重要技术,二维码将成为优先受益市场,背景行业的发展将对二维码产业的发展起到推波助澜的作用。另外,二维码与手机的结合,将开辟二维码的更广阔的市场空间。经过了近几年的技术、应用推广和产业链的不断壮大,我国二维码市场日渐繁荣,未来2-3年将保持高速的成长态势[5]。
二维码技术研究的意义和应用
二维码技术的应用
二维码可以被广泛应用于各个行业,如,物流业、生产制造业、交通、安防、票证等行业,由于各行业特性不同,二维码被应用于不同行业的不同工作流程中。目前,二维码在应用比较广泛的几个行业的具体应用如下:
1.物流行业应用
二维码在物流行业的应用主要包括四个环节。第一,入库管理:入库时识读商品上的二维码标签,同时录入商品的存放信息,将商品的特性信息及存放信息一同存入数据库,存储时进行检查,看是否是重复录入。第二,出库管理:产品出库时,要扫描商品上的二维码,对出库商品的信息进行确认,同时更改其库存状态。第三,仓库内部管理:在库存管理中,一方面二维码可用于存货盘点,另一方面二维码可用于出库备货。第四,货物配送:配送前将配送商品资料和客户订单资料下载到移动终端中,到达配送客户后,打开移动终端,调出客户相应的订单,然后根据订单情况挑选货物并验证其条码标签,确认配送完一个客户的货物后,移动终端会自动校验配送情况,并做出相应的提示。
2.生产制造业
以食品的生产为例,二维码在食品的生产与流通过程中的应用主要在三个环节。第一,原材料信息录入与核实:原材料供应商在向食品厂家提供原材料时,将原材料的原始生产数据制造日起、食用期限、原产地、生产者、遗传基因组合的有无、使用的药剂等信息录入到二维码中并打印带有二维码的标签,粘贴在包装箱上后交与食品厂家。第二,生产配方信息录入与核实:在根据配方进行分包的原材料上粘贴带有二维码的标签,其中含有原材料名称、重量、投入顺序、原材料号码等信息。第三,成品信息录入与查询:在原材料投入后的各个检验工序,使用数据采集器录入检验数据;将数据采集器中记录的数据上传到电脑中,生成生产原始数据,使用该数据库,在互联网上向消费者公布产品的原材料信息。
3.安防类应用
由于二维码具有可读而不可改写的特性,也被广泛应用于证卡的管理。将持证人的姓名、单位、证件号码、血型、照片、指纹等重要信息进行编码,并且通过多种加密方式对数据进行加密,可有效地解决证件的自动录入及防伪问题。此外,证件的机器识读能力和防伪能力是新一代证件的标志。
4.交通管理应用
二维码在交通管理中的应用主要应用环节有:行车证驾驶证管理、车辆的年审文件、车辆的随车信息、车辆违章处罚、车辆监控网络。
行车证驾驶证管理:采用印制有二维码行车证,将有关车辆上的基本信息,包括车驾号、发动机号、车型、颜色等车辆的基本信息转化保存在二维码中,信息的数字化和网络化便于管理部门的实时监控与管理。
车辆的年审文件:在自动检测年审文件的过程中实现通过确认采用二维码自动记录的方式,保证通过每个检验程序的信息输入自动化。
车辆的随车信息:在随车的年检等标志上将车辆的有关信息,包括通过年检时的技术性能参数,年检时间,年检机构、年检审核人员等信息印制在标志的二维码上,以便随时查验核实。
车辆违章处罚:交警可通过二维码掌上识读设备对违章驾驶员的证件上的二维码进行识读,系统自动将其码中的相关资料和违章情况记录到掌上设备的数据库中,再进一步通过联网,实现违章信息与中心数据库信息的交换,实现全网的监控与管理。
二维码研究的意义
维码目前主要是在行业或企业中应用,对于消费者也许我们没有注意它,但二维码与手机结合拓展了二维码的应用空间,最显著的特征,使得二维码离消费者越来越近。技术正应用到我们的生活中,二维码不再向是一个黑白条块/方快,它将成为新的信息沟通平台,为企业和个人带来更多的应用价值。
促进跨媒体营销发展
手 机二维码促进了媒体、通信和互联网的融合,带来一个全新的跨媒体营销平台。使得平面媒体、移动运营商可以充分发挥各自的媒体优势,为企业开辟新营销服务; 对于平面媒体延伸了媒体空间、带来新的广告形式,对于广大企业,利用该平台,开创新的营销模式、增进与客户的互动、提升客户服务。二维码作为一种全新的沟 通方式,在时间、空间、媒介三个维度上实现企业与消费者的沟通。比如一个简单的商品广告,消费者通过扫描旁边的二维码就可以获得产品详细介绍、经销商名 录、成功案例、其他产品系列等信息,甚至通过二维码登录广告商的WAP网站。
促进社会和企业资源的节约,提升社会和经济效益。
手机二维码在应用到电子票务降低票据制作成本、减少配送成本、提升票务防伪和检验能力;提升客户服务质量、有利于开展针对性的营销;手机二维码在应用到电子 折扣上,提升促销效果、增进与客户的互动、降低折扣券制作成本等;手机二维码用在防伪盗版上,可以有效打击防伪盗版,保护消费者利益,为企业创造效益。手 机二维码用于交通违章处理上,可以大大提高工作效率。
(3)为手机用户带来精彩体验
手机二维码的发展简化手机用户信息输入,提升用户获取信息的能力、拓展手机上网入口,带给我们更多精彩体验[6]。
需求分析
系统需求分析
课题可行性分析
随着Android的快速发展和不断完善,Android的应用是越发的广泛。所以基于Android平台的手机小程序也是越来越多、越来越受欢迎。
Java是一种跨平台的,面向对象的,分布式的,解释的,健壮的安全的,结构的中立的,可移植的,性能很优异的多线程的,动态的语言。XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立。
随着Android移动设备大部分都带有自动调焦作用,这就对Android二维码系统的应用带来了更广阔的市场。又各国对二维码的发展和研究,也产生了很多稳定和安全的二维码系统,并且Google根据每种条形码二维码的标准开发了开源项目Zxing。根据Zxing核心库的基础,该系统可以根据核心库提供的二维码标准,依据编码解码原理实该项目的条码、二维码识别。这对二维码的开发和研究带来了更多发展前景[7]。
课题功能需求分析
本次的毕业设计主要就是在基于Android平台下设计并开发一个条码二维码识别系统。运用当前Google提供的Android SDK来以及开源项目Zxing核心库编码解码原理为基础,来实现二位码识别系统。
本课题的总体的功能业务可以主要描述为以下几点:
(1) 主界面上显示出主要的功能
(2) 进行一维条行码的识别
(3) 进行二维QR码的识别
(4) 进行二维DM矩阵码识别
(5) 对二维码进行分享
(6) 软件使用帮助
课题功能需求分析说明
根据对本课题的主要需求的分析做如下说明:
(1) 主界面上主要就是显示该系统所能够进行的动作和所能实现的功能,也是用户进行软件操作的主要界面。
(2) 本软件最强大的功能是实现当前主流的条码、QR码和DM矩阵码的识别功能。
(3) 可以分享二维码。
(4) 对扫描历史进行查看。
(5) 对软件使用提供帮助。
系统界面需求
本系统的界面需要布局合理、美观,需要体现系统的友好性。
系统性能需求
本系统需要扫描速度快、安全性高、处理结果速度快,尽可能为用户节省时间。
运行环境需求
系统运行环境:基于Android操作系统移动设备
系统支持版本:Android 1.5及以上版本
开发环境:Eclipse 3.5 ADT16-16.0.1 JDK-7u3-windows-i586
系统需要解决的问题
开发基于Android二维码识别系统需要解决一下几个问题:
(1)数据库问题
本系统需要用到SQLite轻量级数据库。用SQLite数据库来实现历史记录数据的存放。
(2)布局问题
在Android平台下开发该应用软件,一个非常重要问题的是要解决布局问题。android平台中采用的是xml文件来设置布局。SDK提供了包括图片、文字显示、以及xml文件的设计方法。该系统需要用到FrameLayout布局来调用摄像头。
系统关键技术分析
(1)SQLite轻量级数据库的使用。
该系统需要使用到Android自身的数据库系统,使用SQLite数据创建存放扫描结果的历史记录表。
(2)移动设备Camera摄像头的调用。
该系统要是使用摄像头才能进行二维码的扫描和处理,通过摄像头来进行二维码图片数据的输入。
本章总结
通过对Android平台的架构的分析和对毕业设计课题的需求的分析,我们基本可以了解到该课题的主要功能。为下一阶段的设计的研究打下好的基础。
系统设计
课题需要解决的问题
界面布局
一个Android软件的好坏很大程度上并不是功能如何强大,而是友好易操作的界面的好坏。一个友好的界面不仅让用户更容易操作和使用软件,也让用户感觉到很舒服的感觉。Android系统正是考虑到这一点,为开发人员提供了强大的布局实现,并提供了很多布局方式包括:LinearLayout水平布局、FrameLayout框架布局、RelativeLayout相对布局、TableLayout表单布局和TAbWidget切换卡、AbsoluteLayout绝对布局。
本软件需要用调用Camera来实现扫描功能,需要用到框架布局FrameLayout能重叠控件,实现“范围框”的效果。
条形码二维码解码功能
本系统是根据Google研究开源项目Zxing核心库为基础,通过二维码发布的标准,就是为了实现二维码扫描功能,当前最流行条形码,日韩所使用最多的QR码和美国的DM矩阵码。Zxing不仅对最主要的二维码扫描功能做了详细的分析,同时也实现了国际化的操作,针对不同国家,使用不同的语言,由于QRcode二维码的广泛应用且QRcode支持中文,所以在此我们主要使用QRcode二维码识别,语言为简体中文[9]。
系统用例图如图4-1所示:
图4-1 系统功能用例图
系统总体设计
课题功能框架
基于Android二维码系统功能主要包括:一位条码扫描、二位QR码扫描、DM矩阵码扫描和分享二维码扫描。功能框架如图4-2所示:
图4-2 系统功能模块图
课题总体流程图
启动模拟器,软件会自动运行到主界面,界面会自动变为横屏全屏模式,直接进行二维码扫描界面。当扫描完毕后,我们可以通过扫描的结果进行分享。本课题总体流程图如图4-3所示:
图4-3 系统流程图
上面主要讲解的是软件使用的流程,二维码识别系统通过摄像头来获取图片文件,然后通过图片预处理,然后进行解码,扫描解码流程图如图4-4所示:
图4-4 解码过程图
数据库的概念结构设计
本课题需要创建一个存放扫描历史记录的数据库。
数据库名称:barcode_scanner_history.db
表名:history
表中字段:ID_COL,TEXT_COL,FORMAT_COL,DISPLAY_COL,TIMESTAMP_COL
说明:历史记录实体用来存放二维码查询结果,记录ID是表的主键,唯一标示一条记录。FORMAT_COL列是存放数据存储的格式。TIMESTAMP_COL是用来存放扫描的时间。DISPLAY_COL是用来存储解析值。TEXT_COL用来存放文本信息。、扫描时间、解析显示[10]。
历史记录概念结构设计图如图4-5所示:
图4-5 历史记录实体属性图
系统详细设计
系统模块设计
二维码识别功能模块
用户打开应用程序之后会进入主界面,然后就可以进行二维码扫描,将二维码的图片放于摄像头下面,摄像头会自动调焦,获取二维码图片,然后程序会进行图片解析,解析成功之后将结果显示在屏幕上。流程图如图4-6所示:
图4-6 二维码识别功能流程图
分享功能模块
当用户点击menu菜单之后就会显示分享功能选项,点击之后出现分享联系人、应用程序选项,根据用户不同的选项程序会生成相应的二维码图片,然后其他的用户可以通过二维码扫面的方式尽享分享。分享功能模块的流程图如图4-7所示。
图4-7 分享功能流程图
图4-8 查看历史记录流程图
历史记录功能模块
当用户扫面完二维码之后,程序会自动保存到历史记录表当中,用户可以通过点击menu菜单找到历史记录选项,点击查看历史记录按钮之后,程序会自动弹出历史记录对话框,上面会直接显示扫描过的历史记录。接下来可以进行清除历史记录,发送历史记录操作。流程图如图4-8所示。
系统界面详细设计
主界面设计
系统运行之后就会进入主界面,主界面直接进行扫面,在项目res文件中的layout中的新建一个capture.xml文件,并在里面添加扫描所用到的抽象布局来实现二维码图片获取界面,并设置结果集布局不可见,当扫描后设置结果集布局可见,获取图片的布局设置为不可见,从而来实现二维码识别功能。
分享界面设计
分享界面的按钮实现是在menu菜单中添加的,在运行程序以后我们通过点击menu菜单来实现分享功能,当点击分享按钮时,系统会调用分享功能的Activity来实现。
历史记录界面设计
查看历史记录的界面按钮实现首先也是在menu菜单中添加的,在运行程序以后我们通过点击menu菜单中的查看历史记录选项,然后我们一dialog提示框的方式来显示历史记录的显示。
功能设置界面设计
功能设置界面可以进行系统功能的设置,在项目res文件夹下新建一个xml文件,并进行preferences.xml内容的添加,包括是否选择震动、有无提示音和是否复制到剪切板等功能。
帮助界面设计
在开源项目中下载二维码扫描帮助页面,并在项目中的assets资源文件中新建一个html文件来存放帮助界面,里面包含了如何正确扫面二维码的页面以及如何在网页上生成二维码等界面。
数据库详细设计
本系统采用Android操作系统自带的内嵌小型数据库sqlte3作为后台数据库。
历史记录表设计如表4-1所示:
表4-1历史记录表
字段名称 | 字段类型 | 长度 | 是否为主键 | 说明 |
Id_col | integer | 8 | 是 | 记录id号 |
Text_col | varchar | 40 | 否 | 文本信息 |
Format_col | varchar | 40 | 否 | 存储格式 |
Display_col | varchar | 80 | 否 | 解析值 |
Timastamp_col | datetime | 8 | 否 | 扫描时间 |
本章小结
本章主要根据系统分析,针对本课题进行了总体设计和详细设计,在完成以上总体设计和详细设计之后,至此系统设计阶段基本完成。
编码与实现
开发环境搭配
软件下载安装
JDK下载安装
Eclipse IDE下载安装
Android SDK下载安装
ADT插件安装 注:开发Android应用程序,还需要用到ADT Plugin for Eclipse插件,也可以在Eclipse中网址安装,更利于开发android软件。
配置环境变量
Java JDK环境变量配置
搭配Android 系统的环境变量
AVD(Android virtual device)模拟器
注:可以从Eclipse里面点击Android图标中来启动模拟器管理,同时我们也可以在Android SDK文件夹中直接点击运行AVD Manager。
二维码识别系统功能实现
二维码识别系统界面设计
二维码识别系统启动时需要用调用Camera来实现扫描功能,需要用到框架布局FrameLayout能重叠控件,实现“范围框”的效果。在程序启动后会进入二维码捕捉界面,在res文件layout目录下创建capture.xml,在里面需要添加自定义的View
以看到在XML里面用到了 ViewfinderView 自定义view 。所以新建一个View 的包,然后把:ViewfinderView 和 ViewfinderResultPointCallback 靠到里面(记得对应修改XML里面的包)。
在FrameLayout里面我们还需要加入存放result的控件,在扫描时需要将存放result结果的空间设置为不可见。
实现代码如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<SurfaceView android:id="@+id/preview_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true"/>
<com.google.zxing.client.android.ViewfinderView
android:id="@+id/viewfinder_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/transparent"/>
<TextView android:id="@+id/status_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:background="@color/transparent"
android:text="@string/msg_default_status"
android:textColor="@color/status_text"
/>
</FrameLayout>
SurfaceView是整个界面的窗口,其中的ViewfinderView就是中间扫描的小窗口,其中的TextView是程序扫描的提示框,提示程序扫描时图片要放在窗口中间。
该界面还包含了扫描结果的控件,在扫描时设置为不可见,当扫描出结果是将存放结果的控件设置为可见,上面扫描时的控件设置为不可见。下面的代码是存放结果的控件[11]。
<ImageView android:id="@+id/barcode_image_view"
android:layout_width="160dip"
android:layout_height="wrap_content"
android:maxWidth="160dip"
android:maxHeight="160dip"
android:layout_marginBottom="4dip"
android:adjustViewBounds="true"
android:scaleType="centerInside"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:id="@+id/time_text_view_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/msg_default_time"
android:textColor="@color/result_minor_text"
android:textStyle="bold"
android:textSize="14sp"
android:paddingRight="4dip"/>
<TextView android:id="@+id/time_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/result_minor_text"
android:textSize="14sp"/>
</LinearLayout>
效果图如图5-1所示:
图5-1 主界面布局
二维码功能的设计与实现
二维码识别功能实现
首先建立项目将启动Activity命名为CaptureActivity,并导入核心库。项目完成后我们为CaptureActivity建立布局文件res目录下capture.xml,并修改里面内容。
在XML文档里面用到了ViewfinderView自定义View来获取条码二维码图片。
然后打开CaptureActivity覆盖onCreate方法,代码如下:
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Window window = getWindow();
//设置屏幕保持亮度
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.capture);
//初始化 CameraManager
//这里调用到的 CameraManager 类是控制摄像头的包里的类
CameraManager.init(getApplication());
viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
resultView = findViewById(R.id.result_view);
statusView = (TextView) findViewById(R.id.status_view);
handler = null;
lastResult = null;
hasSurface = false;
historyManager = new HistoryManager(this);
historyManager.trimHistory();
inactivityTimer = new InactivityTimer(this);
//showHelpOnFirstLaunch();
}
这里我们调用了CameraManager类,是控制摄像头的包里的类。我们需要把com.google.zxing.client.android.camera包导入我们建立的应用程序,另外我们还需要用到PlanarYUVLuminanceSource类。
在使用调用Camera时,需要修改项目的配置文件,在manifest.xml中添加如下代码:<uses-feature android:name="android.hardware.camera"/>用来说明程序运行特征,需要用到摄像头。
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.VIBRATE"/>
接着我们覆盖onResume方法初始化摄像头,其中initCamera方法是用来初始化摄像头,如果排除了所有的error ,surfaceHolder.addCallback(this);表示让CaptureActivity实现其callback接口。
解码:
上面的步骤都是对摄像头的控制,而解码真正的工作入口是CaptureActivityHandler里面的。CaptureActivityHandler类中用到解码线程DecodeThread类。这里我们调用handleDecodeInternally方法来实现。
private void handleDecodeInternally(Result rawResult, Bitmap barcode) {
statusView.setVisibility(View.GONE);
viewfinderView.setVisibility(View.GONE);
resultView.setVisibility(View.VISIBLE);
ImageView barcodeImageView = (ImageView) findViewById(R.id.barcode_image_view);
if (barcode == null) {
barcodeImageView.setImageBitmap(decodeResource(getResources(),
R.drawable.launcher_icon));
} else {
barcodeImageView.setImageBitmap(barcode);
}
TextView formatTextView = (TextView) findViewById(R.id.format_text_view);
formatTextView.setText(rawResult.getBarcodeFormat().toString());
ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(this, rawResult);
TextView typeTextView = (TextView) findViewById(R.id.type_text_view);
typeTextView.setText(resultHandler.getType().toString());
DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
String formattedTime = formatter.format(new Date(rawResult.getTimestamp()));
TextView timeTextView = (TextView) findViewById(R.id.time_text_view);
timeTextView.setText(formattedTime);
后返回结果,解码之后会自动将扫描的结果放进rawResult结果集里面[12]。
扫描后结果会显示在屏幕上,如图5-2所示:
图5-2 扫描结果
查看扫描历史记录功能实现
查看历史记录的功能就是从数据库历史记录表history中读取记录。在点击历史记录选项时,查询出内容的界面中,
实现过程:首先将历史记录选项添加到Menu菜单中,当历史记录选项被选择时,添加事件处理函数,系统会调用HistoryActivity类,里面包括数据库的创建,历史记录的插入,查询等操作。其实现界面如图5-3所示:
图5-3 查询历史记录界面
分享功能实现
分享功能就是通过将手机中的书签、应用程序、联系人和剪切板生成二维码显示在手机上,然后其他人可以通过扫描二维码的方法来分享自己手机中的内容。在分享功能的界面中,当点击分享按钮后,就会出现分享的选项供用户选择。分享的二维码。
实现过程:首先在onCreateMenu()函数中添加分享选项。然后在创建的添加选项onOptionsItemSelected()函数当中添加处理函数。当分享按钮被点击时,就会调用ShareActivity,然后在ShareActivity类中添加按钮点击事件,根据用户不同的选择来调用不同的函数。其实现界面如图5-4所示:
图5-4 分享功能界面
本章小结
至此系统的编码与实现阶段已经结束,系统的基本功能已经实现,接下来是系统的运行于测试。
系统测试与运行
测试目的
每个软件的编程,都会出现一些问题和Bug,系统测试的目的,就是要找出该软件可能存在的一些问题和Bug。测试也是软件开发过程的重要部分,用来确认一个程序的品质和性能是否符合开发之前所提出的一些要求。软件测试就是在软件投入运行之前,对软件需求分析、设计规格说明和编码的最后总复审,也是为了发现错误而执行程序的过程。可以说,软件测试的最终目的就是保证软件产品的最终质量。
对于该课题测试主要就是测试以下几方面:
(1)界面是否正常显示
(2)功能是否可以正常的实现
(3)操作过程中是否会有一些Bug出现
(4)系统的后台是否会出现异常的信息
(5)其他方面明显的错误
测试环境
本课题的测试主要是基于Android平台。主要也就是在Windows下搭建的环境通过Android模拟器进行测试和在移动设备上测试,如表6-1所示:
表6-1 测试环境
需求名称 | 需求说明 |
操作系统 | Windows xp以上操作系统、Android系统 |
测试方法 | 黑盒测试(功能测试) |
测试工具 | Eclipse IDE、Android SDK、Android移动设备 |
测试的流程和测试
基于Android模拟器的运行测试
Google公司对于Android的模拟器的开发,让Android的开发有了空前的发展。Android SDK提供的手机模拟器的功能也是十分的强大,操作起来也是十分的方便。所以在Android平台下开发的一些应用程序可以很好的在该模拟器上运行。
当然该模拟器也设置了手机移动设备上的许多功能,如键盘的操作、SD卡的操作、浏览器的操作、短信的发送、手机的设置等等。
最主要的应该是对手机移动设备的屏幕的模拟,通过鼠标来进行触屏操作,用起来十分的方便和舒服。所以,在模拟器上可以真实的模拟出在手机上的运行效果。
(1)启动模拟器。
(2)右键程序,点击“run as”,然后点击“Android application”,程序就运行在Android模拟器中,然后进行测试,如图6-1所示:
(3) 根据课题所实现的功能,然后按照需求分析里面的界面设计和功能模块进行分析,首先是程序界面设计是否符合要求。其次,进行功能模块的测试,本课题主要包括三个主要功能的测试:二维码识别功能测试、二维码分享功能测试和查看扫描纪录功能测试。最后得出测试结果。
图6-1 程序启动主界面
本课题在Eclipse中编码,因为Android虚拟机目前还不支持Camera,所以在Android虚拟机中只能测试到预计的界面效果和其他一些不需要Camera的功能。
基于Android移动设备的运行测试
Android模拟器功能虽然强大,但是和真正的android移动设备有一定的差距,还有一些缺点,所以,android程序的测试还必须要在android移动设备上进行测试。测试步骤如下:
(1)设置android移动设备,打击应用程序,将USB调试打上勾,这样运行,eclipse会自动识别android移动设备,这样程序就可以在android移送设备上进行测试。如图6-2所示:
图6-2 调试界面
(2)右键应用程序,点击“run AS”,点击android application,会出现下图界面,我们选着移动设备,软件就会自动安装到移动设备,结果如图6-3所示:
图6-3 选择移动设备调试界面
然后系统会自动启动移动手机调试,将程序安装到移动设备,然后进行真机测试如图6-4所示:
图6-4 真机测试界面
由于Android模拟器功能的一些局限性,该软件的测试主要是运行在Android移动设备上进行的。下面是针对真机进行的黑盒测试(功能测试)。
(1)条形码二位码识别功能测试,测试结果如表6-2所示:
表6-2 二维码识别功能测试表
测试目的 | 测试功能是否实现 |
测试输入 | 1.产品条形码2.二维码图片 |
测试步骤 | 将手机摄像头对准要识别的条形码二维码图片 |
预期结果 | 扫描结果结果显示在手机屏幕上 |
(2)分享功能测试,测试结果如表6-3所示:
表6-3 分享功能测试表
测试目的 | 测试分享功能是否实现 |
测试输入 | 已扫描的条码二维码 |
测试步骤 | 扫描后按menu菜单会出现分享按钮 |
预期结果 | 可以将条码二维码通过短信微博分享 |
(3)历史记录功能测试,测试结果如表6-4所示:
表6-4 历史记录功能实现
测试目的 | 测试查看历史记录功能是否实现 |
测试输入 | 已扫描的条码二维码 |
测试步骤 | 扫描后按menu菜单会出现分享按钮 |
预期结果 | 历史记录里面存放有之前扫描过的二维码结果 |
Android系统不仅给开发人员提供了模拟器测试,而且还可以联机使用真机测试,这就大大减轻了开发人员的工作,提高软件开发的效率。虽然模拟器提供了真机大部分的功能,但是也有很多不支持的功能,我相信以后的模拟器将会更加接近真机。
本章小结
该软件在移动设备上运行时,基本上达到了很好的效果,与预想的结果基本上一致,所以可以确认该系统对实机是可以运行的。同时对系统的功能的测试也是比较理想的。总体来说,在手机移动设备上没有出现排斥和不兼容的问题。
结束语
经过数个月的努力,基于Android的二维码识别软件终于完成了。由于Android 软件的开源和流行引发了我对Android的强大的好奇心,因此选题时我选择了Android软件的开发,从java基础开始到对Android系统的了解和学习,才有了这次毕业设计的完成,同时也感觉收获颇多。
在这个过程中,我学会了很多Android的相关知识,从Android的系统架构、环境的搭建、Intent、Activity、Service、ContentProvider、SQLite等基础知识到Android游戏开发,都让我感觉到了Android的奇妙所在。此次的学习,我也体会到了网络资源的巨大,利用现有的资源去解决问题,在学校图书馆就是学校的最大财富,从图书馆和网络中能寻求到答案,也能帮助我们快速解决问题。
虽然基于Android的二维码扫描系统已经完成,但是程序还有很多的不足之处,需要来完善和修改。还有很多东西需要学习,所以在此对此次毕业设计的做一个工作总结。
工作总结:
此次毕业设计针对google推出的手机系统平台开发的二位码扫描系统,研究ZXing项目中二维码编码技术和解码实现。
整个系统是基于Google有关二维码Zxing项目为核心建立起来的,主要用到Zxing核心代码库core.jar。Zxing项目支持对一维条码、QR二维码、DM矩阵码等大部分普及的条码二维码扫描功能。我主要着力于用户页面的设计,尽量使页面布局均匀,更加人性化,方便用户操作,并对二维码的编码技术有了大概的了解并通过对核心库代码的研究和调用实现二维码识别功能。
未来展望:
由于多方面因素,本系统还存在许多不足之处,如果有机会我想给这款软件做一些完善,添加一些功能。我会从以下一些几个方面下手:
首先,提高扫描效率,二维码扫描存在的一个很大的问题就是扫描效率很低,提高扫描效率,能节省用户的时间,能让用户有更好的体验。
其次,优化二维码存储容量,二维码之所以能够得到广泛的使用,最主要的就是它比一维条码能够存储更多的信息。随着时代的发展,二维码存储信息的容量还需要增加,才能能更好的满足用户的需求。
最后,优化代码和界面,让用户能体会到更加人性化的界面。
参考文献
杨丰盛. Android应用开发揭秘[M] 北京:机械工业出版社.2010.1.1
郭宏志. Android应用开发详解[M].北京:电子工业出版社.2010.6
刘东,高西全.QRCode码图像处理及识别算法的研究[J].电子技术,2003年22期
陆磊. 基于Android嵌入式平台的QR码识别系统[J]. 电子科技,2004年01期
贾世楼. 信息论理论基础[M].哈尔滨:哈尔滨工业大学出版社,2001
岳欣,解建辉,忻展红.我国二维码业务发展趋势[C].2009年信息通信网技术业务发展研讨会.2009
林均清.模式识别[M].长沙:国防科技大学出版社,1998
刘柯言.中国电信手机二维码业务市场扩展研究[D].北京:北京邮电大学.2009
希创科技.手机二维码现状趋势[EB/OL].http://www.systron.com.cn/2barcode/shouji10.htm,2010.9.2
王水,张晓民.软件工程素质导论[M].郑州:河南科技出版社,2011
Android开发文档.Android类库使用文档[EB/OL]. http://developer.android.com/index.html.android developers, 2009.4
Android二维码研究.基于Android的二维码处理类库[EB/OL].http://code.google.com/p/zxing/,2010.11
附录
Android模拟器Android SDK自带一个移动模拟器。它是一个可以运行在你电脑上的虚拟设备。 Android模拟器可以让你不需使用物理设备即可预览、开发和测试Android应用程序。
Android模拟器能够模拟除了接听和拨打电话外的所有移动设备上的典型功能和行为。Android模拟器提供了大量的导航和控制键,你可以通过鼠标或键盘点击这些按键来为你的应用程序产生事件。同时它还有一个屏幕用于显示Android自带应用程序和你自己的应用程序。为了便于模拟和测试应用程序,Android模拟器允许你的应用程序通过Android平台服务调用其他程序、访问网络、播放音频和视频、保存和传输数据、通知用户、渲染图像过渡和场景。Android模拟器同样具有强大的调试能力,例如能够记录内核输出的控制台、模拟程序中断(比如接受 短信或打入电话)、模拟数据通道中的延时效果和遗失。
1.同时Android模拟器和真机也有很多的不同之处:
不支持呼叫和接听实际来电,但可以通过控制台模拟电话呼叫(呼入和呼出)。
(2)不支持USB连接。
(3)不支持相机/视频捕捉。
(4)不支持音频输入(捕捉),但支持输出(重放)。
(5)不支持扩展耳机。
(6)不能确定连接状态。
(7)不能确定电池电量水平和交流充电状态。
(8)不能确定SD卡的插入/弹出。
2.android模拟器使用注意:
平时使用emulator测试开发的网友注意应该定期清理下C:\Documents and Settings\sh\Local Settings\Temp\AndroidEmulator文件夹,由于Android模拟器每次运行时会临时生成几个.tmp后缀的临时文件,没有几个月功夫简单一看竟然占用磁盘空间高达5GB之多。这些文件网友可以安全的删除。
致谢
这次毕业设计之所以能够顺利的完成,需要感谢老师、朋友和同学的帮助。
首先,我要感谢给我帮助最大的的指导老师X老师,X老师从毕业设计开始的选题、开题报告写作、工作日志的批注、毕业论文的修改等这一系列的过程中都给了我很大的帮助。在选择课题时,张老师就提供给了我许多的课题让我选择,这能让我们自己找到擅长和喜欢的课题来做。也正是对现在二维码的流行,我选择了这个课题。在写开题报告的时候,张老师给予了很多开题时的建议和帮助。在自己每周的工作日志中,X老师也给予了很多好的建议和参考,也提供了基本相关书籍来学习。刚开始从最基本的做起,然后通过查看很多的android书籍和查询二维码相关研究的课题以及二维码的编码和解码技术,完成了此次毕业设计的完成。后来,X老师又给我一些开发项目的重要建议,程序的完成与实现是要能够在别人一做的项目上创新、完善,这样不仅能节省开发时间,也提高了开发的效率。在完成课题开发的时候,张老师给予我的程序整体上的点评和不足。最后是张老师在百忙之中对我的设计、论文的进行了修改和完善。总之,在我做毕业设计的过程中,X老师的建议和帮助对我的毕业设计的完成,起到了很大的作用。
其次,我要感谢我在学校的传授知识的大学老师。感谢老师们在大学这四年来对我的谆谆教导,是你们的辛勤工作为我的专业学习打下了坚实的基础,为我以后的职业生涯之路发挥了重要的作用。同时,老师也教会了我怎样面对自己的人生、规划自己的人生、让你给自己的人生发光等等。我想这一切的一切,都会对我以后的人生产生良好的影响。
最后,我要感谢我的同学和朋友。感谢他们对我的支持和帮助,他们在生活和学习的帮助是我努力前进的动力。在我遇到困难时,帮助我、安慰我。此时,我最想对你们说:谢谢你们。