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