【正文】
開(kāi)發(fā),還需要安裝ADT插件。啟動(dòng)Eclipse,單擊Eclipse的主菜單上Help/Install New Software菜單項(xiàng),單擊窗口“Add..”按鈕。稍稍等幾分鐘,ADT插件安裝完成再配置相應(yīng)環(huán)境變量即可進(jìn)行Android軟件開(kāi)發(fā)了。通過(guò)參照現(xiàn)有相似的其他網(wǎng)站的使用效果和分析實(shí)例進(jìn)行可行性2]研究,主要從以下四個(gè)方面進(jìn)行討論。如果拍照的圖片不是QRcode二維碼條形碼或者程序無(wú)法識(shí)別,則不作任何處理。 經(jīng)濟(jì)可行性二維碼在國(guó)內(nèi)應(yīng)用引起眾多用戶群體的興趣,國(guó)內(nèi)許多廠商已經(jīng)開(kāi)始致力于二維碼的研究,設(shè)備開(kāi)發(fā)與應(yīng)用系統(tǒng)的應(yīng)用推廣及新市場(chǎng)的培育,投資方很看好這個(gè)項(xiàng)目,在資金方面沒(méi)有問(wèn)題,所以在經(jīng)濟(jì)上可行。 社會(huì)可行性本軟件可以讓用戶通過(guò)手機(jī)對(duì)一些產(chǎn)品上的二維碼進(jìn)行掃描識(shí)別,從而查看該產(chǎn)品的真?zhèn)?。根?jù)以上幾個(gè)方面的研究分析,Android二維碼的掃描識(shí)別在技術(shù)上可行、經(jīng)濟(jì)方面可行、操作方面可行、法律方面也是可行的,可得出結(jié)論:應(yīng)該立即進(jìn)行本項(xiàng)目的開(kāi)發(fā)。需求分析的任務(wù)不是確定系統(tǒng)怎樣完成他的工作,而僅僅是確定系統(tǒng)完成哪些工作,也就是對(duì)目標(biāo)系統(tǒng)提出完整、準(zhǔn)確、清晰、具體的要求。從需求分析中已經(jīng)劃分出系統(tǒng)必須完成的許多基本功能,系統(tǒng)分析員將仔細(xì)研究這些功能并進(jìn)一步將它們具體化。因此,必須用行之有效的方法對(duì)軟件需求進(jìn)行嚴(yán)格的審查驗(yàn)證。具體來(lái)說(shuō),在開(kāi)發(fā)過(guò)程中,要熟悉QRcode二維碼解碼和圖像處理的方法,能熟練運(yùn)用JAVA語(yǔ)言,還要懂得軟件工程技術(shù)和系統(tǒng)測(cè)試技術(shù)。 系統(tǒng)功能需求相機(jī)預(yù)覽需求此二維碼識(shí)別系統(tǒng)必須能夠調(diào)用手機(jī)上的照相機(jī)才能獲取二維碼的圖像,因此需要一個(gè)相機(jī)預(yù)覽功能,之后才能獲取我們的二維碼圖片。圖像處理和拍照解碼需求既然此系統(tǒng)是要對(duì)二維碼識(shí)別,我們通過(guò)相機(jī)預(yù)覽后即可進(jìn)行拍照截取圖片,然后對(duì)圖片進(jìn)行處理,同時(shí)需要對(duì)二維碼解碼,因此需要有圖像處理和解碼的功能。調(diào)用手機(jī)撥打電話功能當(dāng)我們二維碼隱藏的是一個(gè)電話號(hào)碼時(shí),這個(gè)時(shí)候我們需要調(diào)用我們手機(jī)撥打電話功能。 系統(tǒng)功能結(jié)構(gòu)圖系統(tǒng)結(jié)構(gòu)圖是對(duì)軟件系統(tǒng)結(jié)構(gòu)的總體設(shè)計(jì)的圖形顯示,在需求分析階段,已經(jīng)從系統(tǒng)開(kāi)發(fā)的角度出發(fā),把系統(tǒng)按功能逐次分割成層次結(jié)構(gòu),使每一部分完成簡(jiǎn)單的功能且各個(gè)部分之間又保持一定的聯(lián)系,這就是功能設(shè)計(jì)。 系統(tǒng)功能結(jié)構(gòu)圖 系統(tǒng)用例圖系統(tǒng)用戶用例圖用例圖就是由主角、用例以及它們之間的關(guān)系構(gòu)成的圖。通過(guò)上面對(duì)系統(tǒng)的分析即可得到系統(tǒng)的用例圖。關(guān)閉相機(jī)用例:關(guān)閉手機(jī)照相機(jī)。(1)調(diào)用瀏覽器用例:如果二維碼信息隱藏的是以“://”開(kāi)頭的網(wǎng)址,那么手機(jī)便調(diào)用默認(rèn)瀏覽器瀏覽該網(wǎng)站。(3)顯示文本信息用例:如果二維碼信息只是包含一些文本信息,那么直接顯示。業(yè)務(wù)用例工作流程說(shuō)明了業(yè)務(wù)為向所服務(wù)的業(yè)務(wù)主角提供其所需的價(jià)值而必須完成的工作。工作流程通常包括一個(gè)基本工作流程和一個(gè)或多個(gè)備選工作流程。 系統(tǒng)活動(dòng)圖 技術(shù)需求Android二維碼掃描系統(tǒng)是一個(gè)綜合性比較強(qiáng)的題目,它需要在學(xué)校學(xué)習(xí)多方面知識(shí),具體的幾個(gè)主要技術(shù)要求如下:android技術(shù)Android開(kāi)發(fā)之前呢,需要配置Android開(kāi)發(fā)環(huán)境。照相機(jī)實(shí)現(xiàn)技術(shù)在了解了android開(kāi)發(fā)的過(guò)程之后需要學(xué)習(xí)android怎樣進(jìn)行照相。調(diào)用Camera和getParameters()方法獲取拍照參數(shù)。調(diào)用Camera. Parameters對(duì)象方法設(shè)置相機(jī)參數(shù)。調(diào)用Camera的startPreview()方法開(kāi)始預(yù)覽取景,在預(yù)覽取景之前需要調(diào)用Camera的setPreviewDisplay(SurfaceHolder holder)方法設(shè)置使用哪一個(gè)SurfaceView來(lái)顯示取景圖片。二維碼圖片處理技術(shù)首先二維碼圖片是圖片的一種,當(dāng)拍攝下來(lái)時(shí)需要將該圖片送往解碼函數(shù)解碼,因此需要獲取預(yù)覽中圖片,在這里用的是bitmap這個(gè)類。這個(gè)系統(tǒng)主要是對(duì)二維碼的一種QRcode進(jìn)行解碼。系統(tǒng)界面需求軟件界面直觀、簡(jiǎn)潔,人機(jī)交互性強(qiáng)。概要設(shè)計(jì)的基本目的就是“概括地說(shuō)系統(tǒng)應(yīng)該如何實(shí)現(xiàn)?”通過(guò)該階段的工作將劃分出系統(tǒng)的物理元素——程序、文件、數(shù)據(jù)庫(kù)、文檔等,另一方面的主要工作是設(shè)計(jì)軟件的結(jié)構(gòu),即確定系統(tǒng)都由哪些模塊組成及模塊之間的相互關(guān)系。設(shè)計(jì)軟件結(jié)構(gòu)的具體任務(wù)是:將一個(gè)復(fù)雜系統(tǒng)按功能進(jìn)行模塊劃分、建立模塊的層次結(jié)構(gòu)及調(diào)用關(guān)系、確定模塊間的接口及人機(jī)界面等。顯然,概要設(shè)計(jì)建立的是目標(biāo)系統(tǒng)的邏輯模型,與計(jì)算機(jī)無(wú)關(guān)。Android二維碼掃描識(shí)別系統(tǒng)需要調(diào)用我們android手機(jī)的照相機(jī),通過(guò)onPictureTaken函數(shù)二維碼圖片處理成位圖,而且將位圖在imageview中顯示出來(lái),然后再對(duì)位圖進(jìn)行譯碼,按照QRCODE二維碼生成的方式解碼成字符型,QRCODE遵循OMIA規(guī)范,如果二維碼隱藏信息是一個(gè)網(wǎng)址那么調(diào)用瀏覽器訪問(wèn)該網(wǎng)站,如果二維碼隱藏的信息是一個(gè)電話號(hào)碼,那么調(diào)用手機(jī)撥打電話功能,如果該二維碼隱藏的信息是普通的文本信息,那么顯示出文本信息即可,若不是QRCODE二維碼不做任何操作。在這個(gè)過(guò)程中必須考慮以下幾個(gè)問(wèn)題:如何將一個(gè)系統(tǒng)劃分成多個(gè)子系統(tǒng);每個(gè)子系統(tǒng)如何劃分成多個(gè)模塊;如何確定子系統(tǒng)之間、模塊之間傳送的數(shù)據(jù)及其調(diào)用關(guān)系;如何評(píng)價(jià)并改進(jìn)模塊結(jié)構(gòu)的質(zhì)量。計(jì)算機(jī)物理系統(tǒng)具體配置方案要經(jīng)過(guò)用戶單位和領(lǐng)導(dǎo)部門的同意才可進(jìn)行實(shí)施。從我國(guó)的實(shí)際情況看,不少單位是先買計(jì)算機(jī)然后決定開(kāi)發(fā)。因?yàn)椋?jì)算機(jī)更新?lián)Q代是非??斓?,就是在開(kāi)發(fā)初期和在開(kāi)發(fā)的中后期系統(tǒng)實(shí)施階段購(gòu)買計(jì)算機(jī)設(shè)備,價(jià)格差別就會(huì)很大。 系統(tǒng)功能模塊系統(tǒng)總體功能有以下幾個(gè)方面:相機(jī)預(yù)覽功能;關(guān)閉相機(jī)功能;拍照解碼:(1)調(diào)用瀏覽器:如果二維碼信息隱藏的是以“://”開(kāi)頭的網(wǎng)址,那么手機(jī)便調(diào)用默認(rèn)瀏覽器瀏覽該網(wǎng)址。(3)顯示文本信息:如果二維碼信息只是包含一些文本信息,那么直接顯示。 系統(tǒng)總體功能模塊圖 拍照解碼功能模塊在整個(gè)系統(tǒng)模塊中最重要的模塊是拍照解碼功能,因此把這個(gè)模塊單獨(dú)分析。它的基本思想是用圖形符號(hào)以黑盒子形式描繪系統(tǒng)里面的每個(gè)部件(程序、文件、數(shù)據(jù)庫(kù)、表格、人工過(guò)程等),表達(dá)信息在各個(gè)部件之間流動(dòng)的情況。 圖片處理過(guò)程圖 界面設(shè)計(jì)界面設(shè)計(jì)是人與機(jī)器之間傳遞和交換信息的媒介,一個(gè)好的界面是很重要的。此系統(tǒng)功能整體上可以分為三個(gè)部分。 系統(tǒng)界面第五章 系統(tǒng)編碼實(shí)現(xiàn) 基本編碼設(shè)置從詳細(xì)設(shè)計(jì)我們已經(jīng)知道系統(tǒng)分為三部分,因此我們?cè)O(shè)置一個(gè)變量bIfPreview來(lái)控制相機(jī)是否為預(yù)覽模式,變量初始化為private boolean bIfPreview = false,及設(shè)置相機(jī)預(yù)覽模式為false。對(duì)布局來(lái)說(shuō),每一層都是一個(gè)線性布局LinearLayout。我們用一個(gè)按鈕實(shí)現(xiàn)該功能,添加一個(gè)按鈕并且設(shè)置并綁定監(jiān)聽(tīng)器。當(dāng)然我們要取得二維碼,因此我們要不活圖片,我們需要設(shè)置圖片的格式和一些參數(shù)。} catch (Exception e) {(TAG, ())。 /* */ parameters = ()。 List s = ()。這里同樣用一個(gè)按鈕并且設(shè)置并綁定監(jiān)聽(tīng)器實(shí)現(xiàn),在監(jiān)聽(tīng)器里面只需要調(diào)用相機(jī)的stopPreview()方法即可關(guān)閉相機(jī),同時(shí)我們要釋放相機(jī)資源將預(yù)覽變量bIfPreview設(shè)置為false。amp。 /* 釋放Camera對(duì)象 */ ()。 } catch (Exception e) { ()。同樣使用一個(gè)按鈕,設(shè)置并綁定監(jiān)聽(tīng)器,監(jiān)聽(tīng)器里面通過(guò)takePicture()函數(shù)調(diào)用相機(jī)的takePicture,takePicture方法調(diào)用一個(gè)jpegCallback回調(diào)函數(shù)專門處理JPEG格式的圖片,調(diào)用onPictureTaken方法將二維碼字節(jié)數(shù)組通過(guò)decodeByteArray方法譯碼成位圖,將位圖顯示在imageview上,再將位圖通過(guò)decodeQRImage函數(shù)譯碼成字符串,對(duì)字符串進(jìn)行比對(duì)實(shí)現(xiàn)其相關(guān)操作。 bm = (_data, 0, )。 int resizeHeight = 120。 float scaleHeight = ((float) resizeHeight) / ()。 /* Bitmap Size */ (scaleWidth, scaleHeight)。 /* 擷取4:3的圖檔的置中紅色框部分100x100像素 */ Bitmap resizedBitmapSquare = (resizedBitmap, 30, 10, 100, 100)。 /* 將傳入的圖文件譯碼成字符串 */ String strQR2 = decodeQRImage(resizedBitmapSquare)。 Uri mUri = (strQR2)。 startActivity(intent)。 Intent myIntentDial = new Intent( , (tel: + aryTemp01[1]))。 } else if (eregi(TEL:, strQR2)) {/* 如果二維碼信息隱藏的是以“TEL:”開(kāi)頭的電話號(hào)碼,那么手機(jī)直接調(diào)用撥打電話功能 */ String[] aryTemp01 = (TEL:)。 startActivity(myIntentDial)。 } } /* 顯示完圖文件,立即重置相機(jī),并關(guān)閉預(yù)覽 */ resetCamera()。 /* 再重新啟動(dòng)相機(jī)繼續(xù)預(yù)覽 */ initCamera()。 } } }。需要注意的是,由于測(cè)試的目標(biāo)的暴露程序中的錯(cuò)誤,從心理學(xué)角度看,由程序的編寫者自己進(jìn)行測(cè)試是不恰當(dāng)?shù)?。此外,?yīng)該認(rèn)識(shí)到測(cè)試決不能證明程序是正確的。測(cè)試只能查找程序中的錯(cuò)誤,不能證明程序中沒(méi)有錯(cuò)誤。在黑盒法的測(cè)試方案中,采用等價(jià)劃分技術(shù),把所有可能的數(shù)據(jù)劃分成幾個(gè)等價(jià)類。單元測(cè)試中通常使用白盒測(cè)試法,也就是根據(jù)程序的內(nèi)部處理邏輯來(lái)設(shè)計(jì)測(cè)試用例。此次測(cè)試用中用到的白盒測(cè)試方法主要是條件覆蓋。 相機(jī)預(yù)覽功能測(cè)試運(yùn)行軟件,點(diǎn)擊“相機(jī)預(yù)覽”按鈕,預(yù)覽窗口出現(xiàn)攝像頭前面的畫(huà)面。 關(guān)閉相機(jī)功能測(cè)試 拍照解碼功能測(cè)試運(yùn)行軟件,點(diǎn)擊“相機(jī)預(yù)覽”按鈕,調(diào)用照相機(jī),然后對(duì)準(zhǔn)我們的QRcode二維碼,點(diǎn)擊“拍照解碼按鈕”,軟件進(jìn)行譯碼動(dòng)作,譯碼出字符串,識(shí)別器條形碼類型,然后運(yùn)行條形碼動(dòng)作。 網(wǎng)址類條形碼測(cè)試當(dāng)QRCODE二維碼隱藏的是以“TEL:15103408894”開(kāi)頭的電話號(hào)碼時(shí)調(diào)用撥打電話功能。 以“wtai://”開(kāi)頭的電話號(hào)碼類條形碼軟件測(cè)試結(jié)果 以“wtai://13935199499”開(kāi)頭的電話號(hào)碼類條形碼調(diào)用手機(jī)撥打電話測(cè)試結(jié)果當(dāng)QRCODE二維碼隱藏的是普通文本信息“android二維碼掃描儀”時(shí),顯示該文本信息即可。Android二維碼的掃描識(shí)別系統(tǒng)設(shè)計(jì)的基本目的,在于通過(guò)理論與實(shí)際的結(jié)合進(jìn)一步提高思想覺(jué)悟,將以前學(xué)習(xí)的知識(shí)串聯(lián)起來(lái)并一步鞏固,以使自己對(duì)知識(shí)的運(yùn)用能力得到提升;而且還鍛煉了我的自學(xué)能力;更重要的是培養(yǎng)了觀察、分析和解決問(wèn)題的實(shí)際工作能力,對(duì)以后的工作將會(huì)起到很好的幫助。由于縮圖之后的清晰度會(huì)降低,還有手機(jī)攝像頭像素等因素,因此也有可能因?yàn)闂l形碼過(guò)于復(fù)雜而導(dǎo)致解碼失敗。致謝本設(shè)計(jì)是在導(dǎo)師李富萍老師的悉心指導(dǎo)下完成的。不僅使我樹(shù)立了遠(yuǎn)大的學(xué)術(shù)目標(biāo)、掌握了基本的研究方法,還使我明白了許多待人接物與為人處世的道理。在此,謹(jǐn)向?qū)煴硎境绺叩木匆夂椭孕牡母兄x! 四年的大學(xué)生活就快走入尾聲,我們的校園生活就要?jiǎng)澤暇涮?hào),心中是無(wú)盡的難舍 與眷戀?;厥姿哪辏〉昧诵┰S成績(jī),生活中有快樂(lè)也有艱辛。我還要感謝所有教過(guò)我的老師,他們四年來(lái)對(duì)我孜孜不倦的教誨,還有幫助過(guò)我的同學(xué),以及我的舍友,是他們?cè)谶@四年的生活里,給予我學(xué)習(xí)和生活上的幫助和照顧,這些都陪我一路成長(zhǎng)。四年的風(fēng)風(fēng)雨雨,我們一同走過(guò),充滿著關(guān)愛(ài),給我留下了值得珍藏的最美好的記憶。每當(dāng)我遇到困難的時(shí)候,父母總是第一個(gè)給我鼓勵(lì)的人。參考文獻(xiàn)[1]:清華大學(xué)出版社,2007年[2]:清華大學(xué)出版社,2008年[3]:中國(guó)鐵道出版社,2003年 [4]:電子工業(yè)出版社,2011年[5]:清華大學(xué)出版社,2007年附錄I 英文原文Beginning Android1. Using XMLBased LayoutsWhile it is technically possible to create and attach widgets to our activity purely through Java code, the way we did in Chapter 4, the more mon approach is to use an XMLbased layout file. Dynamic instantiation of widgets is reserved for more plicated scenarios, where the widgets are not known at piletime (e g., populating a column of radio buttons based on data retrieved off the Internet). With that in mind, it’s time to break out the XML and learn how to lay out Android activities that way.