版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
物理電氣信息學(xué)院本科畢業(yè)論文PAGEPAGE43畢業(yè)設(shè)計(jì)(2013屆)題目基于手持設(shè)備的二維碼圖像的生成與識(shí)別學(xué)院物理電氣信息學(xué)院專業(yè)通信工程年級(jí)2009級(jí)學(xué)生學(xué)號(hào)12009243683學(xué)生姓名高麗指導(dǎo)老師郭中華摘要近幾年,在智能手機(jī)系統(tǒng)群雄紛爭(zhēng)的時(shí)候,2008年Google推出了一款名為Android的開源智能手機(jī)操作系統(tǒng),受到廣大手機(jī)生產(chǎn)商的重視。對(duì)于二維碼技術(shù)而言,我國(guó)對(duì)二維碼這一技術(shù)的需求與日俱增。目前,二維碼技術(shù)在食品質(zhì)量追溯上的使用已越來越廣泛,借助二維碼溯源系統(tǒng),可以實(shí)現(xiàn)食品生產(chǎn)、流通及消費(fèi)的全過程監(jiān)控。因此,基于手機(jī)平臺(tái)的二維碼識(shí)別系統(tǒng)及應(yīng)用的研究,無論是在理論上還是在實(shí)踐中都具有十分重要的意義。本文是基于Android環(huán)境下完成二維碼生成和識(shí)別功能。首先對(duì)Android開發(fā)環(huán)境、組成與架構(gòu)以及AndroidSDK和Eclipse開發(fā)工具進(jìn)行了介紹;其次介紹了二維碼技術(shù)的認(rèn)識(shí),主要是從二維碼技術(shù)特點(diǎn)、二維碼溯源系統(tǒng)和二維碼的應(yīng)用前景這幾個(gè)方面進(jìn)行了介紹,突出了二維碼技術(shù)的優(yōu)勢(shì)以及在溯源系統(tǒng)中的重要性;接著分析了QRCode二維碼的結(jié)構(gòu)、標(biāo)準(zhǔn)及編解碼過程,在對(duì)這個(gè)所設(shè)計(jì)的二維碼全面了解之后,重點(diǎn)的對(duì)基于Android系統(tǒng)的二維碼生成以及識(shí)別的過程展開設(shè)計(jì)。關(guān)鍵詞:Android;二維碼技術(shù);QRCode;二維碼生成;二維碼識(shí)別
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國(guó)內(nèi)外發(fā)展現(xiàn)狀 21.2.1國(guó)內(nèi)發(fā)展歷史 21.2.2國(guó)外發(fā)展歷史 41.3研究?jī)?nèi)容 6第二章開發(fā)環(huán)境 82.1Android開發(fā)平臺(tái) 92.1.1Android平臺(tái)的組成 92.1.2Android系統(tǒng)的架構(gòu) 92.1.3Android系統(tǒng)的應(yīng)用程序組件 112.1.4Android系統(tǒng)的應(yīng)用程序舉例 122.2開發(fā)工具(Eclipse、AndroidSDK、) 13第三章二維碼的生成 213.1QRcode的簡(jiǎn)介 213.1.1QRCode的結(jié)構(gòu)與特性 213.1.2QRCode的標(biāo)準(zhǔn) 233.1.3QRCode的編碼及譯碼過程 233.2基于Android系統(tǒng)的QR碼生成 25第四章二維碼識(shí)別系統(tǒng)的實(shí)現(xiàn) 274.1開源利器zxing 274.2基于zxing的二維碼識(shí)別 284.3源碼系統(tǒng)分析 29第五章總結(jié)與展望 34感謝語 35參考文獻(xiàn): 36附錄1 38附錄2 39第一章緒論二維碼(2-dimensionalcode)作為一種信息存儲(chǔ)和傳遞技術(shù),是按照特定的編碼規(guī)則形成的平面幾何圖形[1-4]。二維碼能夠在橫向和縱向兩個(gè)方位同時(shí)表達(dá)信息。它具有存儲(chǔ)容量大、可靠性高、保密防偽性強(qiáng)、成本低等優(yōu)點(diǎn),可以用來存儲(chǔ)多國(guó)文字、數(shù)據(jù)文件、圖像等信息。隨著3G時(shí)代的來臨,手機(jī)二維碼的應(yīng)用越來越豐富[5-8]。Android系統(tǒng)作為目前最為流行的智能手機(jī)平臺(tái),其與二維碼技術(shù)的結(jié)合時(shí)二維碼信息已各類業(yè)務(wù)的形式在手機(jī)中存貯、閱讀和傳播。手機(jī)既可以作為二維碼信息的載體結(jié)合二維碼識(shí)讀設(shè)備加以應(yīng)用,也可以在手機(jī)中內(nèi)置或下載二維碼識(shí)讀引擎來識(shí)讀商品上的二維碼標(biāo)識(shí),從而獲取二維碼內(nèi)隱含的有效信息來進(jìn)行相關(guān)應(yīng)用的開發(fā)。在許多種類的二維碼中,常用的又:DataMatrix,MaxiCode,Aztec.QRCode,Vericode,PDF417,Utracode.Code49,Code16K等[9]。其中快速響應(yīng)碼(QuickResponsecode,QR碼)[10-11]是應(yīng)用最為成功的一種二維碼,QR碼是一種矩陣式二維碼,信息容量大,一張條碼可以放入1817個(gè)漢字,或7089個(gè)數(shù)字,或4200個(gè)英文字母;支持字母、數(shù)字、漢字、照片、指紋、音/視頻等信息嵌入。跟其他二維碼相比,QR碼具有識(shí)讀速度快、數(shù)據(jù)密度大、占地空間小的優(yōu)勢(shì).把QR碼運(yùn)用在手機(jī)平臺(tái)上,開發(fā)基于Android手機(jī)系統(tǒng)的二維碼生成和識(shí)別系統(tǒng)具有重要的理論意義和實(shí)際價(jià)值。1.1研究背景與意義近幾年,在智能手機(jī)系統(tǒng)群雄紛爭(zhēng)的時(shí)候,2008年Google推出了一款名為Android的開源智能手機(jī)操作系統(tǒng)。Android憑借其開放性和良好的人機(jī)界面,受到廣大手機(jī)生產(chǎn)商的重視。目前手機(jī)數(shù)量已大大超過傳統(tǒng)PC機(jī)的數(shù)量,手機(jī)上網(wǎng)將變得越來越方便和普及,Android對(duì)3G的良好支持使得Android在網(wǎng)絡(luò)方面的優(yōu)勢(shì)更為突出。由于Android基于Linux內(nèi)核且具有開源免費(fèi)的特性[12],它迅速得到廣大愛好者以及許多廠商的支持。同時(shí)Android開源智能操作系統(tǒng)在物聯(lián)網(wǎng)的應(yīng)用中有著廣泛的應(yīng)用前景[13]。二維碼是一個(gè)跨媒體的通道,不管是報(bào)紙、雜志、戶外、液晶媒體等只要在上面有一個(gè)二維碼,就可以通過二維碼來跟人互動(dòng),獲取更多的信息。二維碼與手機(jī)的結(jié)合能夠?yàn)槲覀儙砣魏螘r(shí)間、任何地點(diǎn),通過任何媒介獲取任何內(nèi)容。在日本和韓國(guó),超過8成的手機(jī)用戶通過手機(jī)“掃碼上網(wǎng)”和購買電子票據(jù),給人們的日常生活帶來了極大的便利。近年來,在國(guó)內(nèi)也得到了快速的發(fā)展,并在多個(gè)行業(yè)成功應(yīng)用,如:張學(xué)友07北京演唱會(huì)二維碼電子票;上海世博手機(jī)門票等[14]。手機(jī)二維碼是二維碼技術(shù)在手機(jī)上的應(yīng)用,將手機(jī)需要訪問、使用的信息編碼到二維碼中,利用手機(jī)的攝像頭識(shí)讀。利用手機(jī)二維碼上網(wǎng),為你省去了為手機(jī)上網(wǎng)輸入冗長(zhǎng)的網(wǎng)址,手機(jī)用戶只需通過掃描二維碼下面的號(hào)碼或關(guān)鍵字即可上網(wǎng),隨時(shí)下載如圖文、音樂、視頻、獲取優(yōu)惠劵、參與抽獎(jiǎng)、了解企業(yè)產(chǎn)品信息等。同時(shí),還可以方便地用手機(jī)自動(dòng)輸入短信、識(shí)別和存儲(chǔ)名片,實(shí)現(xiàn)電子地圖查詢定位,獲取公共服務(wù)(如天氣預(yù)報(bào))等多種功能。二維碼業(yè)務(wù)為商家構(gòu)筑自己的WAP平臺(tái)提供了可能,為其他媒體提供了一個(gè)與用戶隨時(shí)隨地溝通的方式。商家或媒體可以搭建自己的WAP網(wǎng)站,用戶對(duì)相應(yīng)的二維碼進(jìn)行掃描后即可獲取更為生動(dòng)而豐富的內(nèi)容。1.2國(guó)內(nèi)外發(fā)展現(xiàn)狀1.2.1國(guó)內(nèi)發(fā)展歷史2004年中國(guó)移動(dòng)在內(nèi)部交流大多會(huì)將手機(jī)條碼業(yè)務(wù)提上議事日程,當(dāng)時(shí)采用的還是來自NTTDoCoMo的條碼手機(jī)產(chǎn)品。2005年開始在湖南長(zhǎng)沙、上海試點(diǎn)手機(jī)二維碼業(yè)務(wù):長(zhǎng)沙主要是與麥當(dāng)勞合作進(jìn)行手機(jī)二維碼折扣劵的試點(diǎn)工作(接入行業(yè)應(yīng)用):國(guó)內(nèi)兩大移動(dòng)電話營(yíng)業(yè)商不斷探索二維碼的發(fā)展應(yīng)用,為手機(jī)二維碼業(yè)務(wù)的善及和推廣做出了積極的貢獻(xiàn)。中國(guó)聯(lián)通公司于2006年5月推出國(guó)內(nèi)第一款條碼手機(jī)ET980:中國(guó)移動(dòng)公司于2006年8月推出手機(jī)二維碼應(yīng)用條碼識(shí)別業(yè)務(wù),并且與多家手機(jī)二維碼解決方案提供商進(jìn)行了合作。這都極大的促進(jìn)了手機(jī)二維碼業(yè)務(wù)的發(fā)展。自此,手機(jī)二維碼不斷出現(xiàn)在各大媒體網(wǎng)站中,成為電信領(lǐng)域關(guān)注的焦點(diǎn)。手機(jī)二維碼在國(guó)內(nèi)的應(yīng)用現(xiàn)狀手機(jī)二維碼在日本和韓國(guó)應(yīng)用時(shí)間較早,使用的人群多,在很多行業(yè)得到了廣泛的應(yīng)用。雖然國(guó)內(nèi)起步晚,但近3你那發(fā)展勢(shì)頭迅速,目前有八大類應(yīng)用經(jīng)過市場(chǎng)初步檢驗(yàn)已趨于成熟,醬紫啊今后的市場(chǎng)中進(jìn)一步得到完善和推廣[15]。移動(dòng)訂票中國(guó)第一張電子電影票2005年由翼碼信息推出,這種形式將傳統(tǒng)票變成電子票,將物流變成電子流,在節(jié)省成本的同時(shí),提高了效率。積分兌換采用手機(jī)二維碼的積分兌換方式后,用戶可以隨時(shí)隨地提出兌換申請(qǐng),并到就近的兌換點(diǎn)兌換禮品。電子VIP以二維碼VIP電子卡代替?zhèn)鹘y(tǒng)實(shí)體VIP卡,VIP客戶只要攜帶手機(jī),就可以享受服務(wù)。目前全球通VIP易登機(jī)的系統(tǒng)已經(jīng)在全國(guó)除港澳臺(tái)地區(qū)的62家主要機(jī)場(chǎng)安裝完畢。電子折扣劵電子折扣劵得以實(shí)現(xiàn)無紙化,直接發(fā)掉用戶手機(jī)中,使用者只需攜帶手機(jī)即可享受餐飲、娛樂、旅游、百貨購物的各種折扣優(yōu)惠。電子提貨劵用電子憑證的形式替代傳統(tǒng)的提貨卷,條碼憑證已廣泛應(yīng)用到實(shí)物營(yíng)銷、實(shí)物派送等方面,大大方便了商家和消費(fèi)者。自助充值機(jī)乘客購買電子客票后,登錄相關(guān)網(wǎng)站,輸入身份證號(hào)機(jī)航班等信息,便可以自行選擇作為,完成自助值機(jī)。之后,乘客只需帶著手機(jī)在機(jī)場(chǎng)專用自助設(shè)備掃描換取實(shí)體的登機(jī)牌,就可通過安檢并登記。能夠更好的體驗(yàn)查詢、訂票、登記一站式的輕松。電子導(dǎo)診用戶可以通過手機(jī)終端預(yù)約掛號(hào),憑二維碼電子憑證在預(yù)約時(shí)間前往醫(yī)院直接取號(hào),大大減少了排隊(duì)掛號(hào)、候診的時(shí)間,為用戶提供了一種新型的就醫(yī)模式。電子簽到會(huì)議、展覽、活動(dòng)通知于簽到,用于企業(yè)訪客登記與安排。1.2.2國(guó)外發(fā)展歷史手機(jī)二維碼應(yīng)用主要包括以下幾種形式。移動(dòng)支付:手機(jī)的支付一般是通過手機(jī)錢包來實(shí)現(xiàn)的,手機(jī)錢包可以當(dāng)作現(xiàn)金、儲(chǔ)蓄卡、保管柜鑰匙、火車票等。如今,越來越多的功能都匯聚到手機(jī)錢包的功能中,這給用戶帶來了極大的便利。手機(jī)支付是手機(jī)二維碼最典型的應(yīng)用,二維碼被廣泛地應(yīng)用于不同的支付方式中。例如,日本的NTTDoCoMo公司采用二維碼技術(shù)來實(shí)現(xiàn)移動(dòng)支付,用戶可以通過二維碼在便利店中支付手機(jī)賬單。賬單信息會(huì)被儲(chǔ)存在二維碼中,并可以通過i-mode的計(jì)費(fèi)中心下載到用戶的移動(dòng)終端上。二維碼還可以處理更復(fù)雜的信息,商店收費(fèi)處的掃描器可以讀取包含計(jì)費(fèi)信息的二維碼,用戶可以直接支付現(xiàn)金給收費(fèi)處。交易的信息則通過收費(fèi)處傳送回計(jì)費(fèi)中心。電子票務(wù):電子票務(wù)也是二維碼的典型應(yīng)用,該應(yīng)用需要結(jié)合售票單位的網(wǎng)站、售票信息發(fā)布平臺(tái)共同完成。消費(fèi)者如果有購票的需求,可通過上網(wǎng)等方式查找相關(guān)的票務(wù)信息,然后可根據(jù)相關(guān)信息發(fā)短信至售票系統(tǒng),再按提示進(jìn)行手機(jī)支付。支付完成后,售票系統(tǒng)會(huì)把電子票以二維碼的形式發(fā)送到購票者手機(jī)中,完成購票流程。日本最大的航空公司日航就提供移動(dòng)票務(wù)服務(wù)。顧客不僅可以通過手機(jī)或互聯(lián)網(wǎng)購買客票,還能通過讀卡器識(shí)別手機(jī)上的代碼,完成檢票并獲得登機(jī)牌。日航還在機(jī)場(chǎng)各處安裝讀卡器,用戶可以使用手機(jī)或卡在機(jī)場(chǎng)商店中消費(fèi)航程積分。在使用FeliCa手機(jī)的用戶中,60%的用戶每周至少會(huì)使用一次支付功能。韓國(guó)首爾龍山驛高速鐵路車站的電影院也應(yīng)用了二維碼來替代傳統(tǒng)的售票方式。其具體做法是,觀眾用手機(jī)到電影院的網(wǎng)站上下載儲(chǔ)存有座位號(hào)等信息的二維碼,在進(jìn)入電影院時(shí)只需將手機(jī)二維碼掃入讀碼器即可入場(chǎng),票款再通過移動(dòng)支付的方式扣除,完全實(shí)現(xiàn)了無紙化作業(yè)。二維碼的識(shí)讀應(yīng)用:識(shí)讀應(yīng)用也是二維碼的重要應(yīng)用之一,主要用于平面介質(zhì)上。消費(fèi)者可以利用照相手機(jī)內(nèi)建的讀碼軟件,輕輕對(duì)準(zhǔn)平面雜志或是海報(bào)上的二維碼一拍,就可以將二維碼圖形立即轉(zhuǎn)化為文字,或是連接到相關(guān)網(wǎng)址,更方便地實(shí)現(xiàn)手機(jī)上網(wǎng)或內(nèi)容下載。2003年,日本電信運(yùn)營(yíng)商KDDI首先推出手機(jī)二維碼業(yè)務(wù)。比如,在一張CD或者DVD光盤上,通過手機(jī)識(shí)別二維碼來了解光盤的內(nèi)容;在旅游景點(diǎn)配合GPS快速定位等。其后不久,韓國(guó)與中國(guó)臺(tái)灣也開始陸續(xù)推出自己的手機(jī)條碼業(yè)務(wù)。現(xiàn)在,在日本、韓國(guó)和中國(guó)臺(tái)灣,手機(jī)條碼已經(jīng)隨處可見。除了雜志和報(bào)紙,二維條碼還被印在名片、戶外廣告牌、優(yōu)惠券和產(chǎn)品包裝等介質(zhì)之上。在二維碼的識(shí)讀應(yīng)用方面,韓國(guó)做得也比較成功,他們?cè)诖髮W(xué)的圖書館中就安裝了讀取二維碼信息的讀碼器。學(xué)生進(jìn)入圖書館時(shí),只需打開手機(jī),調(diào)出手機(jī)上存儲(chǔ)的二維碼,然后將手機(jī)屏幕靠近讀碼器,便可將個(gè)人信息傳到圖書館的電腦中進(jìn)行身份識(shí)別,識(shí)別無誤就可以進(jìn)入圖書館,整個(gè)過程只需要幾秒鐘。這種二維碼識(shí)別方式已經(jīng)替代了原先必須檢驗(yàn)學(xué)生證的傳統(tǒng)方式。此外,圖書館借閱廳的電腦系統(tǒng)也與二維碼讀碼器實(shí)現(xiàn)了連接。學(xué)生只要將手機(jī)上用于身份識(shí)別的二維碼掃入讀碼器,便可在旁邊的電腦上查閱自己的圖書借閱情況。防偽功能:二維條碼具有多重防偽特性,它可以采用密碼防偽、軟件加密及利用所包含的信息如指紋、照片等進(jìn)行防偽,因此具有極強(qiáng)的保密防偽性能。在韓國(guó)的大學(xué)中,為了杜絕冒充別人出勤,學(xué)校專門在教室中安裝了讀取二維碼信息的讀碼器。每個(gè)學(xué)生在進(jìn)入階梯教室時(shí),都需要用儲(chǔ)存有個(gè)人信息二維碼的手機(jī)或磁卡進(jìn)行掃碼。然后,教師即可根據(jù)這些信息得知學(xué)生的出勤情況。由于每個(gè)人的二維碼都具有唯一性,因此這種方式有效杜絕了冒充別人出勤。手機(jī)二維碼市場(chǎng)現(xiàn)狀從全球的二維碼市場(chǎng)來看,亞洲發(fā)展最好,目前亞洲地區(qū)已經(jīng)有7個(gè)國(guó)家、地區(qū)開始提供二維碼業(yè)務(wù)(如表2所示)。而日本、韓國(guó)兩國(guó)最好,截至2006年日本已經(jīng)有6000萬用戶使用二維碼,對(duì)二維碼的認(rèn)知度已經(jīng)高達(dá)96%,在NTTDoCoMo推出的手機(jī)中將有超過90%具有二維碼識(shí)別功能。韓國(guó)也達(dá)到近2000萬用戶,而且新出廠的手機(jī)90%都帶著掃碼工具。日本是最早開始使用二維碼的國(guó)家。目前市場(chǎng)上已有很成熟的QR手機(jī)二維碼市場(chǎng)應(yīng)用,QR條形碼在日本得到相當(dāng)規(guī)模的應(yīng)用,日本的海報(bào)、游覽手冊(cè)、傳單、折扣券、電子票證,甚至連樹上都貼著二維碼,成為日本手機(jī)用戶登錄網(wǎng)站以及獲得廣告商品信息的非常便捷的方式。近幾年來,日本二維碼手機(jī)市場(chǎng)的占有率在逐年上升,從2002年的0.8%上升到了2005年的52.6%,2006年日本二維碼手機(jī)市場(chǎng)占有率達(dá)到70%左右,如圖1所示。日本手機(jī)二維碼的運(yùn)營(yíng)模式是開放的,二維碼掃描是手機(jī)上的一項(xiàng)功能,而不是運(yùn)營(yíng)商提供的一種服務(wù)。二維碼的技術(shù)商將解碼軟件提供給運(yùn)營(yíng)商后,按手機(jī)的裝機(jī)量收取版權(quán)費(fèi),運(yùn)營(yíng)商則將軟件的解碼完全公開,用戶可以進(jìn)行任意編碼。DM碼是韓國(guó)主流的二維碼標(biāo)準(zhǔn)。截至2006年,韓國(guó)的二維碼用戶普及率已高達(dá)50%左右,韓國(guó)的二維碼運(yùn)營(yíng)模式被證明是成功的模式。韓國(guó)的鈴聲下載和游戲已成最熱門DM讀碼服務(wù)。如今,許多的游戲廠商和內(nèi)容提供商,每天都會(huì)在報(bào)紙上刊出不同服務(wù)的二維條碼,讓消費(fèi)者更快去找到使用的內(nèi)容。韓國(guó)的二維碼運(yùn)營(yíng)模式也是由運(yùn)營(yíng)商主導(dǎo)的,但是與日本不同的是,韓國(guó)的二維碼專利權(quán)益是推動(dòng)該市場(chǎng)的主要?jiǎng)恿?。各個(gè)電信運(yùn)營(yíng)商為了爭(zhēng)取到更多的權(quán)益,都開發(fā)了自己的碼制,雖然這樣的模式會(huì)推動(dòng)韓國(guó)二維碼的快速發(fā)展,但這種模式使二維碼的競(jìng)爭(zhēng)更加激烈,可能會(huì)給市場(chǎng)的大規(guī)模推廣造成困難。
在歐洲,DM二維碼已在德國(guó)、烏克蘭、奧地利、瑞士、意大利等國(guó)家應(yīng)用,特別時(shí)足球賽門票銷售已經(jīng)廣泛使用手機(jī)二維碼購買電子票。英國(guó)已計(jì)劃在2010年推出手機(jī)二維碼登機(jī)牌。屆時(shí)乘客不需要機(jī)票和登機(jī)牌,只要用手機(jī)上的登機(jī)二維碼掃描即可登機(jī)。1.3研究?jī)?nèi)容系統(tǒng)主要分為兩個(gè)大的模塊:二維碼的生成和二維碼的識(shí)別。二維碼的生成主要就是基于Winnows上的開發(fā)工具Netbeans開發(fā),而同時(shí)又開發(fā)一個(gè)在Android平臺(tái)下的二維碼生成。而二維碼的識(shí)別主要就是基于Android平臺(tái)來開發(fā),主要就是運(yùn)用AndroidSDK和Eclipse共同開發(fā),但是環(huán)境需要搭建。本系統(tǒng)研究主要包括以下內(nèi)容:要分成生成和識(shí)別兩大部分。識(shí)別功能主要就是對(duì)二維碼和條形碼的識(shí)別。主要就是通過手機(jī)的攝像頭對(duì)二維碼或者是條形碼進(jìn)行掃描,然后把把掃描到的二維碼或者是條形碼送到后臺(tái)進(jìn)行解析,如果解析成功后,就不再進(jìn)行掃描。如果解析不成功,就會(huì)在進(jìn)行掃描采集圖像,在傳到后臺(tái)解析,直到能夠識(shí)別圖像為止。生成功能主要就是對(duì)二維碼的生成。而生成這個(gè)功能可以在電腦上運(yùn)行生成,也可以在手機(jī)上運(yùn)行生成。二維碼的生成主要支持名片、短信、文本、電子郵件及網(wǎng)絡(luò)書簽的生成。當(dāng)用戶選擇好多要生成的對(duì)象時(shí),就會(huì)把用戶輸入的信息送到后臺(tái),通過調(diào)用解析包,來生成還有相應(yīng)信息的二維碼。第二章開發(fā)環(huán)境二維碼的生成主要設(shè)計(jì)的是在電腦上運(yùn)行的桌面程序。通過在電腦上開發(fā)一個(gè)Java程序來生成二維碼。其開發(fā)環(huán)境主要如下表表1Windows平臺(tái)上開發(fā)使用的環(huán)境需求名稱平臺(tái)及工具開發(fā)工具Netbeans優(yōu)化工具Photoshop開發(fā)語言Java運(yùn)行環(huán)境WindowsXP+JDK測(cè)試環(huán)境WindowsXP+JDK二維碼的識(shí)別和生成是在Android平臺(tái)上的開發(fā)的,并使用EclipseIDE工具進(jìn)行開發(fā)的。EclipseIDE安裝ADT插件搭建了很好的Android開發(fā)平臺(tái),方便與編程。至于識(shí)別的功能要用到攝像頭,虛擬機(jī)上面是沒有攝像頭的,這就需要有真機(jī)進(jìn)行二維碼的識(shí)別測(cè)試。Android平臺(tái)開發(fā)環(huán)境如下表:Android平臺(tái)開發(fā)使用的環(huán)境:需求名稱平臺(tái)及工具開發(fā)工具Eclipse、AndroidSDK、測(cè)試機(jī)優(yōu)化工具Photoshop開發(fā)語言Java運(yùn)行環(huán)境Android平臺(tái)測(cè)試環(huán)境Android平臺(tái)2.1Android開發(fā)平臺(tái)2.1.1Android平臺(tái)的組成Android不僅是一種用于移動(dòng)終端設(shè)備的操作系統(tǒng),更是一個(gè)開源的體系架構(gòu)。它大量應(yīng)用了開源社區(qū)的各項(xiàng)成果,并針對(duì)移動(dòng)設(shè)備進(jìn)行了充分優(yōu)化。Android系統(tǒng)主要包含以下功能組件[16]:(1)經(jīng)Google針對(duì)移動(dòng)設(shè)備裁剪和優(yōu)化的Linux內(nèi)核;(2)由Google重新實(shí)現(xiàn)的Java虛擬機(jī)DalvikVM;(3)大量的函數(shù)庫和服務(wù),如瀏覽器引擎WebKit,數(shù)據(jù)庫SQLite;(4)常用的應(yīng)用程序,如撥號(hào)程序和通訊錄等;(5)一套完整的SDK(SoftwareDevelopmentKit),提供了使用Java語言進(jìn)行Android應(yīng)用開發(fā)的API類庫和工具集(包括Android模擬器和EclipseIDE下的開發(fā)工具插件以及一組用于在模擬器和終端設(shè)備上打包、安裝、調(diào)試和測(cè)試應(yīng)用程序的工具);(6)經(jīng)過優(yōu)化的輕量級(jí)2D和3D圖形引擎,用于支持各種游戲的開發(fā);(7)提供常見音頻、視頻和圖片格式支持的底層多媒體庫;(8)用于支持GSM藍(lán)牙、3G、WiFi、攝像頭、GPS和各種輸入設(shè)備的驅(qū)動(dòng)。2.1.2Android系統(tǒng)的架構(gòu)Android操作系統(tǒng)自頂向下分為4層,分別為應(yīng)用層、應(yīng)用框架層、函數(shù)庫和虛擬機(jī)層以及內(nèi)核層[17],結(jié)構(gòu)框架圖如圖2-1所示:圖2-1Android系統(tǒng)架構(gòu)(1)應(yīng)用層(Application)這是架構(gòu)的最上面一層,開發(fā)者可以用Java語言來開發(fā)各種富有創(chuàng)意的應(yīng)用程序。應(yīng)用層提供了一系列核心應(yīng)用程序,包括郵件客戶端、SMS(短信)、日歷、Google地圖、Web瀏覽器(Browser)和通訊錄(Contacts)等。這一層所有(包括開發(fā)人員自己開發(fā)的)應(yīng)用程序都是使用Java語言編寫的。值得一提的是,這些應(yīng)用程序可以同時(shí)執(zhí)行,比如用戶可以一邊聽音樂一邊閱讀郵件。(2)應(yīng)用框架層(ApplicationFramework)這層包含了各種組件,并且這些組件具有可重用性及可替換性。Android應(yīng)用框架為開發(fā)人員方便地編寫,該平臺(tái)的應(yīng)用程序提供了標(biāo)準(zhǔn)的結(jié)構(gòu)和功能組件。借助于應(yīng)用框架,應(yīng)用程序可以方便和安全地訪問系統(tǒng)功能和其他應(yīng)用程序所公布的功能,也可以公布自己的功能供其他應(yīng)用程序使用。應(yīng)用框架主要提供了以下組件和服務(wù):=1\*GB3①豐富及可擴(kuò)展的視圖(Views):即一系列用于構(gòu)建友好用戶界面的可視化對(duì)象或控件,如列表、文本框、按鈕和菜單等。=2\*GB3②內(nèi)容提供器(ContentProviders):為應(yīng)用程序提供數(shù)據(jù)或?qū)崿F(xiàn)應(yīng)用程序間數(shù)據(jù)的共享。=3\*GB3③資源管理器(ResourcesManager):提供對(duì)非代碼資源的訪問和管理,包括字符串、圖形和界面布局等。=4\*GB3④通知管理器(NotificationManager):使應(yīng)用程序可以在不中斷用戶的情況下通知用戶特定的事件。如音樂播放器在后臺(tái)運(yùn)行時(shí),可以在狀態(tài)欄通知用戶當(dāng)前正在播放的歌曲名稱。=5\*GB3⑤活動(dòng)管理器(ActivityManager):管理應(yīng)用程序的生命周期,并提供導(dǎo)航回退功能。=6\*GB3⑥位置管理器(LocationManager):使應(yīng)用程序可以訪問移動(dòng)設(shè)備的當(dāng)前地理位置信息,從而實(shí)現(xiàn)類似GPS導(dǎo)航的功能。(3)函數(shù)庫層(Libraries)Android包含了一套C/C++函數(shù)庫,用以支持操作系統(tǒng)為應(yīng)用程序提供的所有功能,主要包括SurfaceManager、MediaFramework、WebKit、SGL、FreeType、SQLite等。這些函數(shù)庫通常由移動(dòng)設(shè)備生產(chǎn)商編譯為針對(duì)特定硬件平臺(tái)的內(nèi)部機(jī)器碼,安裝在相應(yīng)的移動(dòng)設(shè)備中。應(yīng)用程序不能直接使用這些函數(shù)庫,必須借助于應(yīng)用框架組件和API間接地訪問這些底層函數(shù)庫的功能。(4)運(yùn)行時(shí)環(huán)境(Runtime)Android運(yùn)行時(shí)環(huán)境由Java核心庫和Dalvik虛擬機(jī)構(gòu)成。Dalvik虛擬機(jī)是Google針對(duì)移動(dòng)設(shè)備對(duì)Java虛擬機(jī)的重新實(shí)現(xiàn),可支持多個(gè)虛擬機(jī)實(shí)例的高效運(yùn)行。每個(gè)Android應(yīng)用程序都擁有自己的進(jìn)程空間和一個(gè)獨(dú)立的虛擬機(jī)實(shí)例,因此,Android可以高效地同時(shí)運(yùn)行多個(gè)應(yīng)用程序。Dalvik虛擬機(jī)執(zhí)行后綴為.dex的可執(zhí)行文件,這是一種專門針對(duì)小內(nèi)存設(shè)備優(yōu)化了的文件格式。同時(shí),Dalvik虛擬機(jī)是基于寄存器來實(shí)現(xiàn)方法調(diào)用的,所有類都由Java編譯器編譯(.calss文件),然后通過AndroidSDK中的dx工具轉(zhuǎn)換為.dex格式。Dalvik虛擬機(jī)借助于Linux內(nèi)核來實(shí)現(xiàn)線程和內(nèi)存的管理。(5)Linux內(nèi)核層(LinuxKernel)Android基于Linux2.6內(nèi)核來提供操作系統(tǒng)的核心服務(wù),如進(jìn)程管理、內(nèi)存管理、安全機(jī)制、網(wǎng)絡(luò)通信和驅(qū)動(dòng)模型。內(nèi)核也作為硬件和其余軟件棧之間的一個(gè)抽象層。2.1.3Android系統(tǒng)的應(yīng)用程序組件要進(jìn)行基于Android系統(tǒng)的移動(dòng)應(yīng)用程序的開發(fā),開發(fā)人員需要熟悉以下幾個(gè)基本組件[18]:活動(dòng)(Activity)活動(dòng)是構(gòu)成Android應(yīng)用程序的最常用組件,用來表示一個(gè)用戶界面,類似于Windows應(yīng)用程序中的窗口和對(duì)話框。活動(dòng)在視圖(View)類的協(xié)助下為應(yīng)用程序提供用戶界面(UI)。視圖類可實(shí)現(xiàn)和包含各種UI元素,如文本框、便簽、按鈕和其他UI元素。一個(gè)應(yīng)用程序可包含多個(gè)活動(dòng)來提供多個(gè)用戶界面。應(yīng)用程序可以調(diào)用startActivity()或者startSubActivity()方法來開始一個(gè)新活動(dòng)或切換到另外一個(gè)活動(dòng),方法的參數(shù)是一個(gè)Intent(意圖)對(duì)象,然后由操作系統(tǒng)決定哪個(gè)活動(dòng)最能滿足指定的Intent。意圖(Intent)Intent是Google引入的一個(gè)全新的應(yīng)用程序設(shè)計(jì)元素,來描述用戶期望執(zhí)行或完成的特定動(dòng)作(Action),如“選擇一張圖片”、“輸入一段文字”、“拍攝一張照片”等??梢詫ntent看作是一個(gè)消息,以表示應(yīng)用程序間的一個(gè)功能請(qǐng)求,這可以有效地復(fù)用現(xiàn)有應(yīng)用程序的功能,顯著地提高應(yīng)用程序的開發(fā)效率。如當(dāng)用戶使用郵件客戶端編輯郵件的過程中需要插入一張圖片時(shí),郵件客戶端程序無須自己實(shí)現(xiàn)該功能,只需要?jiǎng)?chuàng)建一個(gè)Intent對(duì)象表示“選擇一張圖片”這一意圖,然后將其作為參數(shù)調(diào)用startActivity()即可,操作系統(tǒng)就會(huì)使用系統(tǒng)上安裝的圖片瀏覽程序供用戶瀏覽和選擇圖片。一個(gè)應(yīng)用程序可以通過向操作系統(tǒng)注冊(cè)IntentFilter來聲明自己有能力或者有興趣執(zhí)行特定的請(qǐng)求或Intent。(3)服務(wù)(Service)服務(wù)就是運(yùn)行于“后臺(tái)”的任務(wù),不直接與用戶交互,因此沒有用戶界面。服務(wù)的生命周期要比活動(dòng)(Activity)長(zhǎng),可長(zhǎng)時(shí)間地運(yùn)行。典型的應(yīng)用場(chǎng)景是,用戶在音樂播放器的用戶界面中選擇并播放歌曲后,便離開了該界面(Activity被終止)去閱讀郵件,但他希望在閱讀郵件的過程中,能同時(shí)聽音樂。這種情況下,負(fù)責(zé)音樂播放任務(wù)那部分代碼就應(yīng)該在運(yùn)行于服務(wù)中。(4)內(nèi)容提供者(ContentProvider)ContentProvider提供了一種多個(gè)應(yīng)用程序共享和訪問數(shù)據(jù)的抽象機(jī)制。將對(duì)數(shù)據(jù)的訪問抽象為ContentProvider可以有效地控制多個(gè)應(yīng)用程序?qū)?shù)據(jù)的讀寫操作,避免訪問沖突,提高數(shù)據(jù)的安全性。Google提倡開發(fā)人員將需要共享的數(shù)據(jù)通過編寫相應(yīng)的ContentProvider供其他應(yīng)用程序訪問,而不是將這些數(shù)據(jù)直接公開。2.1.4Android系統(tǒng)的應(yīng)用程序舉例在了解Android系統(tǒng)的組成、架構(gòu)以及應(yīng)用程序組件之后,接下來我們創(chuàng)建一個(gè)Android程序,進(jìn)一步了解這個(gè)系統(tǒng)。本次設(shè)計(jì)中的程序都是應(yīng)用Java語言編程,使用EclipseIDE來進(jìn)行來開發(fā),并且在Android模擬器(AVD)上測(cè)試的,這個(gè)模擬器兼容AndroidSDKStarterPackage中的AndroidPlatform的版本(開發(fā)環(huán)境為AndroidSDK2.3.3)。本節(jié)首先新建一個(gè)Android項(xiàng)目,并新創(chuàng)建一個(gè)HelloWorld程序,利用Android模擬器來運(yùn)行程序。打開EclipseIDE后,啟動(dòng)AVD(AndroidVirtualDevices),運(yùn)行畫面就如同真的手機(jī)開機(jī)操作一樣,如圖2-2(a)所示,開機(jī)之后,隨即打開創(chuàng)建好的“HelloWorld”程序,如圖2-2(b)所示。(a)(b)圖2-2已創(chuàng)建的“HelloWorld”程序要退出被打開的被打開的“HelloWorld”程序,可以按下手機(jī)模擬器上的退格鍵,如圖2-3所示。圖2-3按下退格鍵離開程序,回到手機(jī)的桌面雖然程序沒有寫,但向?qū)s已經(jīng)幫著寫好了程序進(jìn)入點(diǎn)、布局配置和應(yīng)用程序訪問權(quán)限等,為第四章的設(shè)計(jì)做好了準(zhǔn)備工作。2.2開發(fā)工具(Eclipse、AndroidSDK、)JavaJDK下載:進(jìn)入該網(wǎng)頁:
/javase/downloads/index.jsp
(或者直接點(diǎn)擊下載)如下圖:選擇DownloadJDK只下載JDK,無需下載jre.安裝完成后,進(jìn)入我的電腦->高級(jí)->環(huán)境變量->在JAVA_HOME的變量,值為:C:\...\java\jdk1.6.(不是JRE的路徑).在新建classpath的變量,值為:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tool.jar修改原有path變量,在最后面增加:;%JAVA_HOME%\bin(%之前的分號(hào)需要)下載AndroidSDK下載地址:/sdk/index.html下載版本:Android-sdk_r12-windows下載完成解壓縮后運(yùn)行SDKManager.ExeSDKManager.Exe會(huì)自動(dòng)更新然后列出可安裝的程序補(bǔ)丁,請(qǐng)選擇以下補(bǔ)丁安裝AndroidSDKPlatform–tools,revision6(必須選擇)SDKPlatformAndroid2.2,API8,revision3(必須選擇,模擬器速度不錯(cuò))SDKPlatformAndroid3.2,API13,revision1(最新版,但是模擬器速度不是一般的慢)(左邊Packages項(xiàng)目需要安裝的變?yōu)闋顟B(tài),不需要安裝的變?yōu)闋顟B(tài))下載完成后把SDK的路徑添加到環(huán)境變量的path中:(我的電腦->高級(jí)->環(huán)境變量->path);C:\...\Android\android-sdk(C:之前的分號(hào)需要)下載Eclipse:下載地址:/downloads/下載版本:EclipseIDEforJavaEEDevelopers,212MBEclipse配置AndroidEclipse配置安卓插件:help->InstallNewSoftWare出現(xiàn)如下界面:點(diǎn)擊Add按鈕,出現(xiàn)如下界面:輸入url地址/android/eclipse/,并名稱為Android,點(diǎn)擊ok將出現(xiàn)下圖:點(diǎn)擊next按鈕,將出現(xiàn)下面界面:繼續(xù)點(diǎn)擊next按鈕,將出現(xiàn)下面界面:選擇Iacceptthetermsofthelicenseagreements點(diǎn)擊Next,進(jìn)入安裝插件界面:安裝完成后出現(xiàn)下面界面,重啟eclipse就可以了。配置AndroidSDK最后配置SDK與Eclipse的關(guān)聯(lián),打開Eclipse選中左邊菜單的Android然后SDK的路徑,然后,最后OK。到此配置全部結(jié)束配置工作AVDAndroidSDKManager配置,打開SDKManager.ExeNew新建一個(gè)AVD點(diǎn)擊next出現(xiàn)下面界面:(其中個(gè)人認(rèn)為Skin選擇HVGA模擬器大小比較合適開發(fā)用)然后選中新建的模擬器,點(diǎn)擊就可以運(yùn)行模擬器了(啟動(dòng)稍慢,啟動(dòng)后不要關(guān)閉,在Eclipse中運(yùn)行程序就會(huì)在模擬器中執(zhí)行,程序內(nèi)容變化也不需要反復(fù)啟動(dòng)模擬器)第三章二維碼的生成3.1QRcode的簡(jiǎn)介本次設(shè)計(jì)的二維碼是以QRCode二維碼為例,所以在設(shè)計(jì)之前,我們先對(duì)QR碼進(jìn)行簡(jiǎn)單的介紹。3.1.1QRCode的結(jié)構(gòu)與特性QRCode(QuickResponseCode),稱為快速響應(yīng)矩陣碼[27],是由日本Denso公司于1994年開發(fā)的一種矩陣式二維碼,它具有二維條碼的共同特點(diǎn),如存儲(chǔ)信息量大,可靠性高,可表示漢字、圖像和音頻等多種數(shù)據(jù)類型的信息之外,還具有以下特點(diǎn):(1)超高速識(shí)讀超高速識(shí)讀特點(diǎn)是QR碼區(qū)別于其它二維條碼的一個(gè)主要特性。使用條碼識(shí)讀設(shè)備識(shí)讀條碼時(shí),一秒鐘可以識(shí)讀30個(gè)含有100個(gè)字符的QR碼符號(hào);對(duì)于含有相同數(shù)據(jù)信息的PDF417條碼,一秒鐘只能識(shí)讀3個(gè)符號(hào);對(duì)于DataMatrix,一秒鐘最多可以識(shí)讀3個(gè)符號(hào)。(2)全方位識(shí)讀QR碼具有全方位(360度)識(shí)讀的特點(diǎn),這是QR碼又一個(gè)主要優(yōu)點(diǎn)。在識(shí)別QR碼的過程中要先將具有一定的角度的QR碼作旋轉(zhuǎn)處理,使其四條邊界與坐標(biāo)軸平行垂直,然后根據(jù)QR碼的三個(gè)位置探測(cè)圖形對(duì)其進(jìn)行識(shí)別。(3)可以高效表示漢字由于日本的文字中也存在著大量的漢字,因此QR碼在其設(shè)計(jì)的過程就已經(jīng)實(shí)現(xiàn)了對(duì)漢字的支持。QR碼能夠用特定的數(shù)據(jù)壓縮模式表示中國(guó)漢字和日文,當(dāng)表示漢字時(shí)QR碼僅用13位二進(jìn)制數(shù)據(jù)就足夠了,而其他二維條碼只能夠用字節(jié)表示模式來表示漢字,需用16位二進(jìn)制數(shù)據(jù)(即兩個(gè)字節(jié))表示一個(gè)漢字,所以QR碼的漢字表示容量超出其他二維條碼20%。a、QRCode的結(jié)構(gòu)QR的編碼規(guī)范參見文獻(xiàn)[28],其編碼符號(hào)結(jié)構(gòu)見圖4-1,它包括編碼區(qū)域和功能區(qū)域(包括探測(cè)圖形、分割符、定位圖形和校正圖形)。(1)探測(cè)圖形它包括三個(gè)位置的探測(cè)圖形,分別位于符號(hào)的左上角、右上角和左下角,如圖4-1所示,每個(gè)位置探測(cè)圖形由三個(gè)同心的正方形組成,分別為7×7個(gè)深色模塊、5×5個(gè)淺色模塊、3×3個(gè)深色模塊。由于有掩模的作用,符號(hào)中其他地方遇到類似圖形的可能性極小,所以探測(cè)圖形可以用來識(shí)別QR碼符號(hào),并可確定條碼的位置和方向。圖4-1QR碼的符號(hào)結(jié)構(gòu)(2)定位圖形水平和垂直定位圖形分別為一個(gè)模塊寬,由深色與淺色模塊交替組成的一行和一列圖形,它們的位置分別位于第6行與第6列。作用為確定符號(hào)的密度和版本,為模塊坐標(biāo)位置作參考。(3)校正圖形每個(gè)校正圖形可看作是三個(gè)同心的正方形,由5×5深色模塊,3×3淺色模塊和一個(gè)中心深色模塊構(gòu)成,校正圖形的數(shù)量視版本而定。b、QRCode的基本特性,見表4-1表4-1QRCode的基本特性符號(hào)尺寸21×21模塊(版本1)~177×177模塊(版本40)可編碼字符集及容量·數(shù)字型數(shù)據(jù):7089個(gè)字符·字母數(shù)字型數(shù)據(jù):4296個(gè)字符·8位字節(jié)型數(shù)據(jù):2953個(gè)字符·中國(guó)漢字字符及日本漢字字符:1817個(gè)字符數(shù)據(jù)表示方法深色模塊表示二進(jìn)制“1”,淺色模塊表示二進(jìn)制“0”糾錯(cuò)能力采用Reed-Solomon糾錯(cuò),糾錯(cuò)等級(jí)分為L(zhǎng)級(jí)(糾錯(cuò)7%)、M級(jí)(糾錯(cuò)15%)、Q級(jí)(糾錯(cuò)25%、H級(jí)(糾錯(cuò)30%)附加特性結(jié)構(gòu)鏈接:允許最多16個(gè)QR碼在邏輯上連續(xù)表示一個(gè)數(shù)據(jù)文件掩模:使得因相鄰模塊造成譯碼困難的可能性減為最小擴(kuò)充解釋:可以進(jìn)行針對(duì)編碼我國(guó)于2000年發(fā)布了QR碼的國(guó)家標(biāo)準(zhǔn),隨著QR碼在各領(lǐng)域的推廣和智能手機(jī)的快速發(fā)展,如何在智能手機(jī)中較好地識(shí)別QR碼是一項(xiàng)值得研究的課題,本章將主要討論在Android平臺(tái)下產(chǎn)生以及識(shí)別QR碼。3.1.2QRCode的標(biāo)準(zhǔn)在上節(jié)中介紹了QRCode的結(jié)構(gòu)與特性,它是一種矩陣型二維碼的符號(hào),具有存儲(chǔ)信息容量大、可靠性高、超高速全方位識(shí)讀的特點(diǎn),可表示漢字、圖像等多種類型信息,并由于其用特定的數(shù)據(jù)壓縮模式表示中國(guó)漢字和日本漢字,在亞洲地區(qū)如中國(guó)、日本、韓國(guó),應(yīng)用得最為廣泛。為了使QRCode的應(yīng)用在中國(guó)標(biāo)準(zhǔn)化,中國(guó)物品編碼中心制定了快速響應(yīng)矩陣碼國(guó)家標(biāo)準(zhǔn)GB/T18284-2000,neqISO/IEC18004:2000。該標(biāo)準(zhǔn)是對(duì)ISO/IEC18004標(biāo)準(zhǔn)進(jìn)行了取舍和補(bǔ)充完善。如:用中國(guó)漢字?jǐn)?shù)據(jù)表示模式代替了ISO/IEC18004中日文表示模式的內(nèi)容。3.1.3QRCode的編碼及譯碼過程(1)編碼過程QRCode的編碼流程圖如圖4-2所示:圖4-2QRCode的編碼流程圖①得到用戶輸入數(shù)據(jù),進(jìn)行數(shù)據(jù)分析分析輸入的數(shù)據(jù)流,確定要進(jìn)行編碼的字符類型,確定用戶選擇的糾錯(cuò)等級(jí)(如果沒有則選擇默認(rèn)等級(jí)),根據(jù)糾錯(cuò)等級(jí)和數(shù)據(jù)容量,選擇與數(shù)據(jù)相適應(yīng)的最小編碼版本。②數(shù)據(jù)編碼按照所選擇模式的編碼標(biāo)準(zhǔn),將數(shù)據(jù)字符轉(zhuǎn)換為位流。在數(shù)據(jù)位流前加上模式指示符,在數(shù)據(jù)位流之后加上終止符,將產(chǎn)生的位流分為每8位一個(gè)碼字,必要時(shí)加入填充字符以填滿按照版本所要求的數(shù)據(jù)字?jǐn)?shù)。③糾錯(cuò)編碼按標(biāo)準(zhǔn)要求將碼字序列分塊,以便生成相應(yīng)的糾錯(cuò)碼字。分段后的數(shù)據(jù)通過RS糾錯(cuò)電路,生成相應(yīng)的糾錯(cuò)碼字,并加入到相應(yīng)的數(shù)據(jù)碼字序列的后面。④構(gòu)造最終信息按標(biāo)準(zhǔn)的數(shù)據(jù)排列方式構(gòu)建最終排列信息,必要時(shí)加入剩余位。⑤在矩陣中標(biāo)識(shí)功能模塊不同的版本因要嵌入不同數(shù)量的校正圖形,因此對(duì)應(yīng)不同的矩陣排列。矩陣中要加入功能圖形,首先要標(biāo)識(shí)功能圖形的位置,并在對(duì)應(yīng)位置加入功能圖形中的探測(cè)圖形、分隔符、定位圖形和校正圖形。⑥在矩陣中布置數(shù)據(jù)模塊按照排列標(biāo)準(zhǔn),將數(shù)據(jù)碼字模塊放入矩陣中的對(duì)應(yīng)位置。⑦加入掩模用8種掩模圖形依次對(duì)符號(hào)的編碼區(qū)域的位圖進(jìn)行掩模處理,評(píng)價(jià)所得到的8種結(jié)果,選擇最優(yōu)的一種。⑧加入格式和版本信息生成版本信息(版本7以上)和格式信息,構(gòu)成符號(hào),加入矩陣對(duì)應(yīng)位置。⑨生成條碼圖形根據(jù)上面步驟得到的1、0矩陣,生成對(duì)應(yīng)的黑白方塊條碼圖形。(2)譯碼過程QRCode譯碼系統(tǒng)的文件讀入有兩種方式,一種是直接從圖像文件(.bmp)讀入,找到條碼圖像,進(jìn)行譯碼;另一種是從QRCode的數(shù)據(jù)文件(.qr)讀入條碼信息,進(jìn)行譯碼。本次設(shè)計(jì)采用的是第一種,所以這里介紹讀入圖像文件,進(jìn)行譯碼。將圖像文件讀入,由于采集到的條碼圖像通常存在畸變、污染等,因此在定位條碼前需要進(jìn)行圖像的處理,包括圖像畸變校正、噪聲去除、二值化和圖像旋轉(zhuǎn)等操作[29-31]。QRCode圖像識(shí)別過程具體流程如圖4-3所示:圖4-3QRCode條碼圖像識(shí)別流程圖解碼的步驟和編碼正好相反,步驟為:①提取格式信息,版本信息;②去掩模;③抽取數(shù)據(jù)信息和糾錯(cuò)信息;④RS糾錯(cuò);⑥對(duì)糾錯(cuò)后的數(shù)據(jù)信息進(jìn)行解碼。有了糾錯(cuò),圖像的部分污染也能正確解出碼來,大大提高了QRCode碼的可識(shí)讀性。3.2基于Android系統(tǒng)的QR碼生成首先打開EclipseIDE后,輸入有關(guān)QRCode生成的Java程序(主要程序見附錄1)。QRCode二維碼為ISO/IEC18004所規(guī)范,在網(wǎng)絡(luò)上有許多開放的Library來進(jìn)行編碼范例,因此,在運(yùn)行程序之前,先到下載forJava版本使用的庫函數(shù),并將文件名稱更名為SwetakeQRCode.jar。此次設(shè)計(jì)有三個(gè)重點(diǎn):①引用產(chǎn)生的QRCode二維碼的SwetakeQRCode.jar函數(shù)庫。②將User輸入的字符串,利用SwetakeQRCode.jar函數(shù)庫轉(zhuǎn)成產(chǎn)生圖片文件的二維數(shù)組,作為產(chǎn)生二維碼的依據(jù)。③在SurfaceView上繪制二維碼圖片。此程序中自定義函數(shù)AndroidQREncode()有兩個(gè)參數(shù),分別位于編碼的字符串以及要指定的QRCodeVersion(可接受0~40)。程序默認(rèn)的QRCodeVersion為4,能接受62個(gè)字符,所以,若需要接受更多字符編碼,則需要修改QRCodeVersion的數(shù)值。創(chuàng)建com.swetake.util.Qrcode對(duì)象testQrcode后,將ErrorCorrection設(shè)置為M(可接受L,M,O,Q等值),以及調(diào)用testQrcode.calQrcode()將其編碼為二維boolean數(shù)組,自定義函數(shù)drawQRCode()則接受來自編碼后的boolean二維數(shù)組,將其在SurfaceView上繪制出QRCode二維碼。準(zhǔn)備好應(yīng)用程序之后,啟動(dòng)AVD,運(yùn)行程序后,運(yùn)行結(jié)果見圖4-4(a)。單擊“產(chǎn)生QRCode條形碼”的按鈕,則生成網(wǎng)址為“http://”的QRCode二維碼,如圖4-4(b)所示。(a)(b)圖4-4運(yùn)行結(jié)果上一個(gè)例子,生成的是一個(gè)網(wǎng)址的二維碼,下面我們通過java變成生成任意功能的二維碼,用戶可以選擇所要生成的二維碼信息進(jìn)行填寫如圖(a),如點(diǎn)擊名片,輸入姓名、職業(yè)、固定電話、移動(dòng)電話,然后單擊生成QR碼,就會(huì)出現(xiàn)如(b)的畫面,之后點(diǎn)擊產(chǎn)生QR條形碼就會(huì)出現(xiàn)我們想要的二維碼,如圖(c)所示。(程序見附表1)
(a)(b)(c)圖4-5生成的二維碼第四章二維碼識(shí)別系統(tǒng)的實(shí)現(xiàn)二維碼的識(shí)別主要是通過對(duì)攝像頭的調(diào)用,啟用多線程,對(duì)攝像頭進(jìn)行快速的回調(diào)應(yīng)用,當(dāng)一次回調(diào)的圖像沒有識(shí)別出來就進(jìn)行下一次的回調(diào),直到識(shí)別出二維碼為止。同時(shí)由于對(duì)與二維碼的大小不同,顯示的模糊度不同等等原因,會(huì)使攝像頭不能很好的采集圖像,在這里要使攝像頭能夠進(jìn)行自動(dòng)對(duì)焦,從而使識(shí)別更快的實(shí)現(xiàn)。當(dāng)識(shí)別完成以后就對(duì)用戶進(jìn)行提醒,對(duì)手機(jī)進(jìn)行震動(dòng)和播放聲音,播放完成,顯示識(shí)別出來的結(jié)果。本文使用ZXing1.6實(shí)現(xiàn)條碼/二維碼識(shí)別。ZXing是個(gè)很經(jīng)典的條碼/二維碼識(shí)別的開源類庫,longlongago,就有開發(fā)者在J2ME上使用ZXing了,不過要支持JSR-234規(guī)范(自動(dòng)對(duì)焦)的手機(jī)才能發(fā)揮其威力,而目前已經(jīng)有不少Android手機(jī)具備自動(dòng)對(duì)焦的功能。4.1開源利器zxing.ZXing是一個(gè)開源Java類庫用于解析多種格式的條形碼和二維碼.官網(wǎng):HYPERLINK"/p/zxing/"/p/zxing/截止目前為止最新版本為1.7,提供以下編碼格式的支持:UPC-AandUPC-EEAN-8andEAN-13Code39Code93Code128QRCodeITFCodabarRSS-14(allvariants)DataMatrixPDF417('alpha'quality)Aztec('alpha'quality)同時(shí)官網(wǎng)提供了Android、cpp、C#、iPhone、j2me、j2se、jruby、objc、rim、symbian等多種應(yīng)用的類庫,具體詳情可以參考下載的源碼包中。4.2基于zxing的二維碼識(shí)別將完整的zxing程序包導(dǎo)入Eclipse軟件,并模擬仿真,結(jié)果如圖所示:(如圖5-1)(a)zxing模擬器(b)解析成功頁面圖5-1zxing解析二維碼隨后將具有Android系統(tǒng)的手機(jī)與電腦相連,并點(diǎn)擊下載程序,安裝此系統(tǒng),于是手機(jī)便可調(diào)用此程序調(diào)用攝像頭掃描識(shí)別二維碼。本文代碼運(yùn)行的結(jié)果如下,使用91手機(jī)助手截圖,得到所識(shí)別的二維碼:(如圖5-2所示)圖5-2二維碼識(shí)別4.3源碼系統(tǒng)分析本文使用了ZXing1.6的core,即把/zxing-1.6/core/下的src復(fù)制覆蓋工程的src;另外還要使用到/zxing-1.6/android/下的PlanarYUVLuminanceSource.java。PS:/zxing-1.6/android/是BarcodeScanner的源碼,本文程序相當(dāng)于BarcodeScanner的精簡(jiǎn)版,只保留最基本的識(shí)別功能。地址:/downloads349/sourcecode/comm/android/detail1521939.html源碼目錄結(jié)果如下圖,ChecksumException.java下面還有很多源文件,截圖尚未列出本文例子必須要開攝像頭和自動(dòng)對(duì)焦的權(quán)限,不然啟動(dòng)時(shí)會(huì)報(bào)異常,所用的權(quán)限如下:[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才能重疊控件實(shí)現(xiàn)“范圍框”的效果: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是主類,負(fù)責(zé)控制Camera和對(duì)圖像做解碼,源碼如下:[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;//按照標(biāo)準(zhǔn)HVGAfinalstaticintwidth=480;finalstaticintheight=320;intdstLeft,dstTop,dstWidth,dstHeight;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);this.setTitle("Android條碼/二維碼識(shí)別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);//初始化定時(shí)器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();}}/***自動(dòng)對(duì)焦后輸出圖片*/privateCamera.PreviewCallbackpreviewCallback=newCamera.PreviewCallback(){@OverridepublicvoidonPreviewFrame(byte[]data,Cameraarg1){//取得指定范圍的幀的數(shù)據(jù)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);//設(shè)置尺寸parameters.setPictureFormat(PixelFormat.JPEG);mCamera.setParameters(parameters);mCamera.startPreview();//開始預(yù)覽Log.e("Camera","surfaceChanged");}@OverridepublicvoidsurfaceCreated(SurfaceHolderarg0){mCamera=Camera.open();//啟動(dòng)服務(wù)try{mCamera.setPreviewDisplay(holder);//設(shè)置預(yù)覽Log.e("Camera","surfaceCreated");}catch(IOExceptione){mCamera.release();//釋放mCamera=null;}}@OverridepublicvoidsurfaceDestroyed(SurfaceHolderarg0){mCamera.setPreviewCallback(null);mCamera.stopPreview();//停止預(yù)覽mCamera=null;Log.e("Camera","surfaceDestroyed");}/***自動(dòng)對(duì)焦并回調(diào)Camera.PreviewCallback*/publicvoidAutoFocusAndPreviewCallback(){if(mCamera!=null)mCamera.autoFocus(mAutoFocusCallBack);}/***自動(dòng)對(duì)焦*/privateCamera.AutoFocusCallbackmAutoFocusCallBack=newCamera.AutoFocusCallback(){@OverridepublicvoidonAutoFocus(booleansuccess,Cameracamera){if(success){//對(duì)焦成功,回調(diào)Camera.Pr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 租車協(xié)議合同范本示例
- 真心相待的夫妻保證書
- 簡(jiǎn)單隱私保護(hù)合同協(xié)議樣本
- 規(guī)范文本偷錢保證書范例
- 建筑勞務(wù)分包安全管理協(xié)議
- 精確市場(chǎng)調(diào)研制作合同
- 綠化項(xiàng)目招標(biāo)答疑
- 軟件開發(fā)合同協(xié)議范本示例
- 零售店長(zhǎng)工作合同
- 補(bǔ)充合同格式范本
- 支氣管動(dòng)脈造影護(hù)理
- 2024年度建筑工程有限公司股權(quán)轉(zhuǎn)讓合同3篇
- 校園春季安全
- 2024-2025學(xué)年六上科學(xué)期末綜合檢測(cè)卷(含答案)
- 【MOOC】工程力學(xué)-浙江大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 2024年湖南省公務(wù)員考試《行測(cè)》真題及答案解析
- 工會(huì)十八大精神、工會(huì)法知識(shí)考試題庫及答案
- 水利水電工程單位分部工程施工質(zhì)量評(píng)定表(完整版)
- 形式發(fā)票樣本
- 往復(fù)壓縮機(jī)填料函結(jié)構(gòu)及原理課件講解
- 干線鐵路牽引變電所設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論