班-以學(xué)號(hào)姓名_第1頁
班-以學(xué)號(hào)姓名_第2頁
班-以學(xué)號(hào)姓名_第3頁
班-以學(xué)號(hào)姓名_第4頁
班-以學(xué)號(hào)姓名_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Ⅳ、主要參考資料[1][1]RetoMeier著,譯.Android4高級(jí)編程出版社[2][2]G.Nudelman著譯AndroidUI設(shè)計(jì)模式[M].人民郵電版社[3].瘋狂Android講義[M].電子工業(yè) M.Owens,G.Allen著 ,謝志強(qiáng)譯 指南電子工業(yè) [6][6]O.Cinar著.于紅,馮艷紅.AndroidC++高級(jí)編程:使NDK[M].計(jì)算機(jī)學(xué)院(系) 畢業(yè)設(shè)計(jì)()時(shí)間:2014年3月3日至2014年6月3答辯時(shí)間:2014年6月10日 指導(dǎo)教師 教師或答疑教師(并所負(fù)責(zé)部分系(教研室 (簽字 指導(dǎo)老師對(duì)電視的內(nèi)容進(jìn)行補(bǔ)充,從而改善傳統(tǒng)電視的局限性。研究?jī)r(jià)值。本文設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)用于匹配電視的Android客戶端,能夠?qū)崟r(shí)對(duì)正AndroidUI組件實(shí)現(xiàn)客戶端的圖形界面。最后實(shí)現(xiàn)按鈕、列表等特定UI元素的交互操作。第二,設(shè)計(jì)并實(shí)現(xiàn)客戶端的功能。本文使用研究的一種音頻技術(shù)對(duì)現(xiàn)音頻提取算法的移植,并完成音頻的提取和保存。最后需要將音頻發(fā)送:Android,移動(dòng)應(yīng)用,匹配,音頻DesignandImplementationofAdMatchingApplicationBasedonAuthor:Peng-feiTutor:RUANLiWiththedevelopmentoftechnology,mobileinligentdeviceshavebeenrapidlypopularized.TraditionalTVmediahasstartedtocombinewithmobileinligentdevices,andtheconceptoftheSecondScreenApplicationhasemerged.Throughsuchapplications,peoplecansupplementthecontentofevisionprogramstoimprovethelimitationsoftraditionalTVmedia.Sinceevisionadvertisingisanimportantwayforpromotingtheproduct,thesecondscreenapplicationsforevisionadvertisinghasagreatresearchvalue.ThispaperdesignedandimplementedanAndroidapplicationformatchingevisionadvertising.Thiscouldhelptoinstantlymatchtheevisionadvertisingwhichisplaying,andcouldprovideuserswithadditionalinformationwhichisassociatedwiththematchedad.Themaincontentsofthispaperincludethefollowingaspects:ly,itwastodesignandimplementtheuserinterfaceoftheapplication.Userinterfaceofmobileappsisanimportantfactorwhichcouldimpactusers'experience.Intheplace,itneededtocompletetheprogramoveralllayoutoftheapplicationandthedesignofeachinterfaceaccordingtothecharacteristicsofmobileapplications.ThenweusedtheabundantUIcomponentswhichwereprovidedbyAndroidtorealizethegraphicalinterfacesoftheapplication.Finally,itcouldrealizetheinteractiveoperationofspecificUIelementssuchasbuttons,lists,etc.Secondly,itwastodesignandimplementthecorefunctionalityoftheapplication.Inthispaper,weusedasortofaudiofingerprintingtechnologyofourlaboratorytomatchtheevisionadvertising.Intheplace,itneededtostudyaboutthewayofgettingaudiodataoftheevisionadvertising.Thenitneededtostudyhowtoimplementthetransplantationofextractionalgorithmoftheaudiofingerprint,andhowtocompletetheextractionandpreservationoftheaudiofingerprint.Finally,itneededtosendtheaudiofingerprinttotheserver-sideformatching,andtoobtainthematchingresultandadditionalinformation.緒 課題來 課題背景與意 課題背 課題意 國(guó)內(nèi)外研究現(xiàn) 研究目標(biāo)與研究?jī)?nèi) 研究目 研究?jī)?nèi) 的組織結(jié) 相關(guān)技術(shù)分 本章小 客戶端的整體設(shè) 客戶端需求分 客戶端功能流 客戶端整體框 本章小 客戶端的具體實(shí) 客戶端開發(fā)環(huán) 用戶界面模塊的實(shí) 用戶界面的設(shè)計(jì)原 客戶端整體布局方 客戶端用戶界面的實(shí) 通用組件的實(shí) 功能模塊的實(shí) 服務(wù)框架的實(shí) 音頻錄制及預(yù)處理的實(shí) 提取及保存音頻的實(shí) 匹配音頻的實(shí) 數(shù)據(jù)庫模塊的實(shí) 匹配結(jié)果數(shù)據(jù)庫的實(shí) 數(shù)據(jù)庫通用接口的實(shí) 異步查詢的實(shí) 本章小 客戶端實(shí) 實(shí)驗(yàn)環(huán) 客戶端安裝實(shí) 用戶界面模塊實(shí) 功能模塊實(shí) 數(shù)據(jù)庫模塊實(shí) 本章小 總結(jié)與展 工作總 工作展 參考文 緒住地址、、等瑣碎而又非常重要的信息,使得電視的效果大打折扣。隨著技術(shù)的發(fā)展,移動(dòng)智能設(shè)備已經(jīng)成為了集頭、多、傳感器、互聯(lián)網(wǎng)、觸摸屏等為一體的強(qiáng)大工具。IOS、Android等主流操作系統(tǒng)的不斷更新和完善,使得各 以獲取的信息。但是, 會(huì)影響的視覺效果,且辨識(shí)率較低,因此應(yīng)用效果遠(yuǎn)不如互聯(lián)密和檢索等方面。通過數(shù)字技術(shù),可以提取音頻、、、文本等數(shù)據(jù)的數(shù)字電視一般具有多個(gè)要素,如音頻、等,因此采用數(shù)字技術(shù)對(duì)進(jìn)行除此之外,還可以對(duì)其它電視進(jìn)行匹配,增加的多樣性和。例如電視劇時(shí),用戶可以獲取時(shí)間、演員表、劇情、花絮等附加信息,同時(shí)將自己的心情到社交網(wǎng)絡(luò)。據(jù)Yahoo部門在2011年1月的一項(xiàng)研究[6]顯示,86%的移動(dòng)互聯(lián)網(wǎng)用戶會(huì)在收看電視使用自己的移動(dòng)設(shè)備,如圖1.1所示。同時(shí),有23%使用移動(dòng)設(shè)備的用戶表示他們?yōu)g覽的內(nèi)容與他們所看的電視相關(guān)。第二屏應(yīng)用[8]作為移動(dòng)互聯(lián)網(wǎng)的一個(gè)熱門趨勢(shì),許多公司都在考慮如何將電視的服務(wù)擴(kuò)張到電視領(lǐng)域。另一款基于地理位置機(jī)購物應(yīng)用Shopkick,也將自己的商業(yè)模式推廣到了電視這個(gè)巨大的市場(chǎng)。同時(shí),一些發(fā)布的第二屏應(yīng)用也得到了用戶的認(rèn)可,如電視識(shí)別應(yīng)用WiO等。這些應(yīng)用都采用了音頻技術(shù)來識(shí)別電視,但是由于其商業(yè)性質(zhì),算法都沒有公開。以下是這幾個(gè)應(yīng)用的具體功能、圖1.1用戶電視時(shí)利用移動(dòng)互聯(lián)網(wǎng)進(jìn)行的活動(dòng)1、秒鐘,它就可以返回這首歌的名字、歌手、所屬專輯等信息。目前,Shazam曲庫的歌圖1.2音樂識(shí)別應(yīng)用WiO是一款由WiOffer公司推出機(jī)應(yīng)用,目前只有IOS版本,如圖1.4所示。用戶可以通過WiO立即了解當(dāng)前的電視或的相關(guān)信息。電視商業(yè)在WiO上的方式如下。首先,商向WiOffer公司提供其商業(yè)或中植入的部分;然后,WiOffer公司為這段添加一個(gè)數(shù)碼標(biāo)識(shí),這樣安裝了WiO應(yīng)用程序機(jī)能夠在電視時(shí),通過對(duì)進(jìn)行匹配,從而為消費(fèi)者提供關(guān)于該產(chǎn)品的商可以通過WiO為用戶提品券、圖1.4WIO主界面的目標(biāo)是基于Android系統(tǒng),設(shè)計(jì)并實(shí)現(xiàn)一個(gè)界面簡(jiǎn)潔美觀的電視匹配客戶端(下文簡(jiǎn)稱客戶端),能夠支持音頻錄制,音頻數(shù)據(jù)預(yù)處理,提取、發(fā)送音頻,接匹配系統(tǒng),用于改善傳統(tǒng)電視的交互性。第一,客戶端的UI框架。簡(jiǎn)潔美觀的UI是移動(dòng)應(yīng)用程序設(shè)計(jì)中最基本但又十分重UI布局,并利Android提供的各UIUI界面。果將耗時(shí)較長(zhǎng)的任務(wù)直接放在GUI線進(jìn)行處理,就會(huì)造成GUI線程阻塞,導(dǎo)致應(yīng)移到子線完成,并通過子線程與GUI線程之間的通信來更新UI界面。這部分需要研究如何利用Android的組件來完成服務(wù)模塊及線程之間的通信。第四,音頻的提取和。為了提高效率,音頻提取算法的部分采用C++編寫。首先需要編寫相應(yīng)的接口,并將其編譯成動(dòng)態(tài)庫,以便在匹配客戶端中進(jìn)行調(diào)用。提取音頻時(shí),Android端將預(yù)處理得到的音頻數(shù)據(jù)傳入C++函數(shù),完成音頻的計(jì)算后將結(jié)果返回給Android端并按指定格式為文本文件。在這個(gè)過程中,所有文件操作及音頻的預(yù)處理都由Android端完成。第五,匹配結(jié)果的保存和查詢。得到匹配結(jié)果后,需要將其在本地,以便用戶查詢。在這一部分,需要研究Android的持久化數(shù)據(jù)原理,設(shè)計(jì)并實(shí)現(xiàn)匹配結(jié)果的實(shí)現(xiàn),最后對(duì)其進(jìn)行了實(shí)驗(yàn)和測(cè)試。的組織結(jié)構(gòu)如下:了的研究目標(biāo)和研究?jī)?nèi)容。用程序組成,開發(fā)框架,Android本地開發(fā)等相關(guān)知識(shí)。塊劃分,分別講述了用戶界面模塊、功能模塊和數(shù)據(jù)庫模塊的實(shí)現(xiàn)方法。相關(guān)技術(shù)由于匹配客戶端是基于Android系統(tǒng)開發(fā)的,因此需要對(duì)Android的系統(tǒng)架構(gòu)、應(yīng)用程序組成、開發(fā)框架等有足夠的了解。本章主要介紹客戶端的設(shè)計(jì)過所Android是一個(gè)Linux為基礎(chǔ)的開放源代碼操作系統(tǒng),主要用于移動(dòng)設(shè)備,如智能和平板電腦,由公司和開放及開發(fā)。從2008年10月第一款A(yù)ndroid發(fā)布至今,已經(jīng)有超過10億部移動(dòng)設(shè)備采用了Android系統(tǒng),使其成為全球第一大智能操作系統(tǒng)。不過經(jīng)過多年的發(fā)展,Android的概念已經(jīng)不再是一個(gè)單獨(dú)的操作系統(tǒng),而是一個(gè)由3個(gè)部分組成[1]:Android最引人注目的是它的開放理念。通過一系A(chǔ)PI庫,所有應(yīng)用程序都可以Android系統(tǒng)與其他操作系樣,采用了分層的架構(gòu),如圖2.1所示。從圖中可以看出,AndroidLinux內(nèi)核層、運(yùn)行庫層、應(yīng)用1、Linux圖2.1ANDROID系統(tǒng)架構(gòu)圖程序庫。在內(nèi)核之上,包含了各種C/C++庫(例如libc和SSL),以及圖形庫、多、外觀管理器、Webkit、等程序庫。系統(tǒng)運(yùn)行庫。Android運(yùn)行時(shí),可以讓一個(gè)Android從本質(zhì)上與一個(gè)移動(dòng)Linux實(shí)現(xiàn)區(qū)分開來。由于Android運(yùn)行時(shí)包含了庫和Dalvik虛擬機(jī),因此,它是庫。提供了Java編程語言庫的大多數(shù)功能。每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)運(yùn)行,并且都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例。Dalvik虛擬機(jī)。Dalvik是一個(gè)基于寄存器的虛擬機(jī),它已經(jīng)被優(yōu)化從而確保一Linux內(nèi)核進(jìn)行線程和底層內(nèi)存管應(yīng)用程序框架提供了用來創(chuàng)建Android應(yīng)用程序的類。它還對(duì)硬件提供了一般的抽象,并管理用戶界面和應(yīng)用程序資源。下一節(jié)中,具體講述Android應(yīng)用程應(yīng)用層在運(yùn)行在Android運(yùn)行時(shí)內(nèi),并且使用了應(yīng)用程序框架中可用的類和服務(wù)。在Android中,所有應(yīng)用程序都有著同樣的優(yōu)先級(jí)。第和本地應(yīng)用都使用相同的API并使用相應(yīng)的第應(yīng)用程序來替代,比如主屏幕、等。Android應(yīng)用程序由松散耦合的組件組成,并使用一個(gè)Manifest文件——AndroidManifest.xml綁定到一起。Manifest文件在項(xiàng)目層次中的最底層,它描述了和平臺(tái)要求、外部庫以及必需的權(quán)限。以下是Android應(yīng)用程序的基本組成部分。1、Activity是應(yīng)用程序的表示層。應(yīng)用程序中每一個(gè)UI都是通過Activity類的一個(gè)或2、戶進(jìn)行交互的任務(wù)(如音樂、網(wǎng)絡(luò)等)。3、Intent是一個(gè)強(qiáng)大的應(yīng)用程序間的消息傳遞框架。Android中大量Intent,它可以用來啟動(dòng)和停止Activity和Service,在系統(tǒng)范圍內(nèi)向目標(biāo)ActivityServiceBroadcastReceiver廣播消息,以及請(qǐng)求對(duì)特定的一條數(shù)據(jù)執(zhí)行操作。4、Broadcast顧名思義,BroadcastReceiver就是廣播,它可以讓應(yīng)用程序可以到那些收到的Intent,這個(gè)特點(diǎn)使它成為了事件驅(qū)動(dòng)程序的最佳選擇。5、的首選方法。對(duì)于一個(gè)任務(wù)較多的應(yīng)用程序,Notification是一個(gè)很實(shí)用的功能,讓用戶能夠及時(shí)獲知任務(wù)的處理進(jìn)度。例如一個(gè)運(yùn)行在網(wǎng)絡(luò)程序,當(dāng)任務(wù)完成后,可以通過聲音、振動(dòng)、閃燈或滾動(dòng)顯示消息的方式來提醒用戶。6、Content提供了幾個(gè)有用的數(shù)據(jù)庫,例如和聯(lián)系人信息等。Android數(shù)據(jù)在開發(fā)Android應(yīng)用程序之前,需要并安裝JDK(JavaDevelopmentKit,JavaAndroidSDK包含了眾多開發(fā)工具和實(shí)用程序,可以幫助開發(fā)者創(chuàng)建、測(cè)試和調(diào)試強(qiáng)大的調(diào)試工具,可以監(jiān)視和控制那些能夠調(diào)試應(yīng)用程序的Dalvik模擬器。ADB(AndroidDebugBridge,Android調(diào)試橋)。ADB提供了對(duì)虛擬設(shè)備、實(shí)際設(shè)備的,允許文件、安裝已編譯的應(yīng)用程序包以及運(yùn)行s命令。 IInterface,Java本地調(diào)用)標(biāo)準(zhǔn)即可。

Java集成了Android交叉編譯環(huán)境,并提供了一套簡(jiǎn)單易用的Makefile。通過這些工具,開發(fā)者可以快速構(gòu)建C/C++動(dòng)態(tài)庫。同時(shí),NDK能自動(dòng)將編譯好的so動(dòng)態(tài)庫與Java代碼一起打包成Android應(yīng)用程序安裝包(.apk),為開發(fā)者節(jié)省很多時(shí)間。本章主要介紹了在匹配客戶端的設(shè)計(jì)與實(shí)現(xiàn)過所涉及的理論基礎(chǔ)和相關(guān)技術(shù)。2.1Android的概念和發(fā)展做了簡(jiǎn)單的介紹。2.2Android的系統(tǒng)架AndroidSDK,并列出了一些重要的工具包。2.5Android的本地開發(fā)工具NDK??蛻舳说恼w傳統(tǒng)的電視依然是大部分人業(yè)余時(shí)間的一個(gè)重要消遣。電視作為電視中不可或缺的一部分,對(duì)于商家、和觀眾都有著很大的影響。另一方面,功能豐富、在電視的同時(shí),都會(huì)使用自己的移動(dòng)智能設(shè)備做一些自己喜歡的事情。因此,越來越多的開發(fā)商都在嘗試將電視和應(yīng)用結(jié)合起來,出現(xiàn)了社交電視[7]和第二限。例如電視,人們通常只能記住的品牌,對(duì)于、和具體的商品信息Android系統(tǒng)設(shè)計(jì)并實(shí)現(xiàn)一款移動(dòng)應(yīng)用,使用戶在是采用實(shí)時(shí)錄制的電視音頻進(jìn)行匹配。以下是具體的功能需求。2、利用實(shí)時(shí)錄制的音頻完成匹配。首先需要采用移動(dòng)設(shè)備的功能獲取正以讓人接受的。因此需要利用現(xiàn)有的算法提取一段可以代表音頻樣本的音頻,將其圖3.1客戶端功能流程音頻,同時(shí)將其保存到文本文件中。模塊、功能模塊和數(shù)據(jù)庫模塊。圖3.2是客戶端整體框架的示意圖。圖3.2客戶端整體框架功能模塊。該模塊包含了客戶端服務(wù)框架、獲取原始音頻數(shù)據(jù)、封裝原始音頻數(shù)據(jù)、對(duì)音頻文件進(jìn)行預(yù)處理、提取音頻并保存、音頻的匹配據(jù)庫用于保存匹配結(jié)果,使用了Android的內(nèi)置數(shù)據(jù)庫;底層接口用于本章主要講述了客戶端的功能需求和整體設(shè)計(jì)。3.1節(jié)對(duì)客戶端的功能需求進(jìn)行了客戶端的具體塊、功能模塊、數(shù)據(jù)庫模塊的具體實(shí)現(xiàn)方法。AD(AndroidAndroid進(jìn)行客戶端的開發(fā),它包括了Eclipse、SDK和DDMS等一系列工具。下面是具體的開操作系統(tǒng):WindowsADT版本:AndroidDeveloperToolsJAVA版本:Java7UpdateAndroidAPI版本:AndroidAndroidNDK版本:AndroidNDK通過Android提供的UI組件完成客戶端各界面的具體實(shí)現(xiàn)。用戶界面設(shè)計(jì)的要求越來越高。在設(shè)計(jì)用戶界面時(shí),應(yīng)該遵循以下基本原則:的布局方案,如圖4.1所示。圖4.1用戶界面整體布局方案如設(shè)置界面和結(jié)果展示界面,為了保持風(fēng)格一致,僅去掉了TAB選項(xiàng)卡和操作欄Android應(yīng)用程序的用戶界面是由以下元素組成的一般采用XML文件來描述。ActivityActivity中,可以控制布局和顯示UI,并響應(yīng)用戶的動(dòng)作。3、獲取用戶界面中指定UI組件的,為其添加顯示內(nèi)容或交互操作。持,通過繼承ActionBarActivity的方式創(chuàng)建主界面的類MainActivity:publicclassMainActivityextendsMainActivityActionBarActivity,因此已經(jīng)默認(rèn)啟用了操比較簡(jiǎn)單,因此主要講述操作欄右側(cè)菜單的實(shí)現(xiàn)方式。界面,退出按鈕用于關(guān)閉用戶界面并結(jié)束線程。首先需要?jiǎng)?chuàng)建一個(gè)XML文件,用 <itemandroid:id="@+id/action_settings"<itemandroid:id="@+id/action_exit" 其中,結(jié)點(diǎn)為菜單的根結(jié)點(diǎn),item結(jié)點(diǎn)為每個(gè)菜單按鈕的描述,可以通過item的icon、title等屬性指定菜單按鈕的圖標(biāo)、名稱等。然后,通過MainActivity的onCreateOptions 過以下方式描述菜單的XML文件: publicboolean Item{intid=item.getItemId(); idswitch(id){case//case////}}ActionBar對(duì)象,并使用該對(duì)象的setNavigationMode方法啟用TAB選項(xiàng)卡:ActionBaractionBar=getSupportActionBar();其序號(hào)返回不同的Fragment子界面進(jìn)行展示。2、退出完全退出應(yīng)用程序時(shí),會(huì)銷毀當(dāng)前界面并終止所有服務(wù),因此需要使用框通過繼承DialogFragment類的方式來創(chuàng)建一個(gè)ExitDlgFragment類:publicclassExitDlgFragmentextendsExitDlgFragment類通過onCreateDialog方法返回框的實(shí)例。在onCreateDialog<RelativeLayout /apk/res/android"<ImageViewandroid:id="@+id/app_bg_img"<TextViewandroid:id="@+id/op_step"其中ImageView是用來填補(bǔ)空白的,TextView用來展示匹配的進(jìn)度,Button了設(shè)計(jì)。雖然可以直接使用當(dāng)作按鈕背景,但是考慮到在不同分辨率的設(shè)備中首先創(chuàng)建一個(gè)XML文件,通過layer-list創(chuàng)建一個(gè)資源,按鈕的形狀。在layer-list中,所有item中的形狀可以通過層疊組一個(gè)新的形狀。 /apk/res/android"<shapeandroid:shape="oval"<solidandroid:color="#BFFF"<item><!--其中selector的每一個(gè)item代表了一種狀態(tài)。 /apk/res/android"<itemandroid:state_enabled="true"android:state_focused="false"<layer-list><!--/layer-<itemandroid:state_enabled="true"android:state_pressed="true"<layer-list><!--/layer-就是使用列表。雖然可以在一般的Fragment中直接使用列表視圖來實(shí)現(xiàn),但是Android提供了ListFragment來簡(jiǎn)化實(shí)現(xiàn)過程。publicstaticclassHistoryFragmentextendsListFragment然后為HistoryFragment創(chuàng)建一個(gè)布局<LinearLayout <ListViewandroid:id="@id/android:list"<TextViewandroid:id="@id/android:empty"在匹配結(jié)果時(shí),則展示TextView中的內(nèi)容。<LinearLayout <TextViewandroid:id="@+id/item_date"<LinearLayout<TextViewandroid:id="@+id/item_result"HistoryFragment中通過onListItemClick方法為每個(gè)列表?xiàng)l目綁定點(diǎn)擊事件。當(dāng)匹配成功后,會(huì)返回一個(gè)與匹配結(jié)果相關(guān)的URL地址,需要實(shí)現(xiàn)一個(gè)結(jié)果高性能瀏覽器,用于在Activity中直接展示網(wǎng)頁。下面講述如何利用WebView實(shí)頁,TextView用于展示匹配失敗時(shí)的信息,默認(rèn)是隱藏的:<RelativeLayout /apk/res/android"<WebViewandroid:id="@+id/details_wv"<TextViewandroid:id="@+id/details_tv"android:visibility="gone"最后在DetailsActivity中獲取WebView的,通過WebView的loadUrl方法就可以加載指定的URL地址:WebViewwv=(WebView)findViewById(R.id.details_wv); 可以直接在DetailsActivity中打開該網(wǎng)頁。設(shè)置界面用于設(shè)置客戶端的首選項(xiàng),Android使用了一種簡(jiǎn)單的持久化數(shù)據(jù)方創(chuàng)建設(shè)置界面。PreferenceActivity框架主要由以下幾個(gè)部分組成:控件、運(yùn)行的值和每個(gè)控件的SharedPreference鍵。PreferenceActivityPreferenceFragment,用來顯示PreferenceScreenSharedPreference變化程序,用于SharedPreference的變化,保證設(shè)置PreferenceScreen布局,使用PreferenceCategory將相同類型的設(shè)置合并到一起<PreferenceScreen /apk/res/android"<PreferenceCategoryandroid:key="pref_key_category_msg"<CheckBoxPreferenceandroid:key="notification_checkbox"<CheckBoxPreferenceandroid:key="notification_sound_checkbox"<PreferenceCategoryandroid:key="pref_key_category_func"<ListPreferenceandroid:key="pref_audio_len"<ListPreferenceandroid:key="pref_audio_interval"<ListPreferenceandroid:key="pref_audio_number"第一個(gè)PreferenceCategory使用了兩個(gè)復(fù)選框來設(shè)置是否允許客戶端觸發(fā)通知及是否開啟通知和振動(dòng)效果;第二個(gè)PreferenceCategory用于設(shè)置匹配時(shí)的<string-array</string-publicclassSettingsActivityextendsPreferenceActivity 應(yīng)的情況,需要將它們移到子線完成。本節(jié)首先講述如何實(shí)現(xiàn)一個(gè)用于執(zhí)行不可見任務(wù)的服務(wù)框架,然后講述如何實(shí)現(xiàn)音頻錄制、提取等主要功能,最后講 即使在UI不可見的時(shí)候也可以保證應(yīng)用程序的持續(xù)運(yùn)行。另一方面,由于Service跟Activity一樣,運(yùn)行在應(yīng)用程序進(jìn)程的主線,因此對(duì)于耗時(shí)較長(zhǎng)的任務(wù),同樣需要Service中創(chuàng)建子線程來執(zhí)行。IntentServiceService的包裝類,可以接收一個(gè)包含完成任務(wù)所需參數(shù)的Intent,并直接在子線執(zhí)行指定的任務(wù)。因此在匹配客戶端中,使用IntentService實(shí)現(xiàn)服務(wù)。publicclassMatcherServiceextendsAndroid:enabled="true">Intentintent=newIntent(this,MatcherService.class);此時(shí),即便用戶關(guān)閉了客戶端的用戶界面,Service中的任務(wù)也將在繼續(xù)執(zhí)行。在Android應(yīng)用程序中,不能在子線直接更新UI元素,需要使用一些方法證子線程與GUI線程同步。Intent是一個(gè)系統(tǒng)級(jí)的消息傳遞機(jī)制,同時(shí)可以通過新UI元素。如圖4.2所示。圖4.2服務(wù)示意圖publicclassMatcherReceiverextends作的Intent。同時(shí),新建一個(gè)MatcherReceiver的實(shí)例receiver。在匹配客戶端中,需要過濾動(dòng)作為“STEP”的Intent:privateIntentFilterfilter=newIntentFilter(“STEP”);privateMatcherReceiverreceiver=newMatcherReceiver();最后,需要使用函數(shù)registerReceiver和unregisterReceiver在UI界面不同的生命周期對(duì)分別對(duì)receiver進(jìn)行和注銷。時(shí),需要指明使用的過濾器filter:registerReceiver(receiver,filter);//BroadcastReceiverunregisterReceiver(receiver);//BroadcastReceiver后通過sendBroadcast函數(shù)進(jìn)行廣播:IntentstepIntent=new//stepIntentBroadcastReceiver通過onReceive函數(shù)來廣播并觸發(fā)相應(yīng)的事件處理函數(shù),因此只需重寫MatcherReceiveronReceive函數(shù),添加對(duì)客戶端UI更新操作。匹配過,需要更新的UI元素是主界面中用于描述匹配狀態(tài)的文字視圖。默認(rèn)應(yīng)用程序中,Notification是那些不可見的應(yīng)用程序組件(BroadcastReceiver、Service、非活動(dòng)狀態(tài)的Activity)提醒用戶的首選機(jī)制。它有以下這些功能:LED閃爍、讓振動(dòng)、發(fā)出聲Notificationn=在匹配客戶端中,需要根據(jù)應(yīng)用設(shè)置中和振動(dòng)”選項(xiàng)來判斷是否需要配置Notification和振動(dòng)選項(xiàng)另外通過setContentIntent函數(shù)可以為Notification得對(duì)它的:Stringsn=NotificationManagernm=(NotificationManager)把一個(gè)Notification和一個(gè)整型ID一起傳遞給NotificationManager的notify方頻的音頻數(shù)據(jù)。在Android中,提供了兩個(gè)可以實(shí)現(xiàn)的類:MediaRecorder和AudioRecord。其中,MediaRecorder類的使用方式比較簡(jiǎn)單,但是支持的音頻格式較少,而且得到的音頻都是經(jīng)過壓縮的,質(zhì)量不高,無法用于提取音頻。AudioRecord類則可以直接從硬件緩沖區(qū)錄制音頻獲取PCM編碼的原始音頻數(shù)據(jù)因此采用AudioRecord獲取原始音頻數(shù)據(jù),然后封裝為wav格式,以便提取音頻。類圖如圖4.3所示。圖4.3AUDIORECORDER類圖isRecordingtrue,audioTimeLen設(shè)置為應(yīng)用設(shè)置中“音頻長(zhǎng)度”的值。AndroidAudioRecord類是直接從硬件緩沖區(qū)獲取音頻原始數(shù)據(jù),因此還需AudioRecord類的getMinBufferSize函數(shù)獲得。然后,創(chuàng)建一個(gè)AudioRecord對(duì)象等參數(shù)。執(zhí)行audioRecord的startRecording函數(shù)即可開始:之后,創(chuàng)建一個(gè)判斷條件為isRecording的循環(huán),并在這個(gè)循環(huán)中不斷通過任務(wù)中,需要做的事情是將isRecording設(shè)置為false。最后經(jīng)過audioTimeLen所指定的時(shí)間,Timer將觸發(fā)執(zhí)行TimerTask中的任務(wù),把而使音頻的長(zhǎng)度剛好為audioTimeLen的值。以在其它平臺(tái)或中進(jìn)行處理,選擇將原始音頻數(shù)據(jù)和音頻的基本信息封裝為wav格式。其中,數(shù)據(jù)部分通常采用無壓縮的PCMrecord方法獲取原始音頻數(shù)據(jù)的編碼方式一致;文件頭部分則包含了音頻數(shù)據(jù)的編碼參數(shù)。因此,只需要在原始音頻數(shù)據(jù)的頭部添加一個(gè)描述音頻信息的wav文件頭,就可以得到標(biāo)準(zhǔn)的wav文件。在AudioRecorder類中,使用getWavAudio函數(shù)將原始音頻文件封裝為標(biāo)準(zhǔn)wav音頻文件。參考附錄A中標(biāo)準(zhǔn)wav音頻文件的文件頭格式,可以發(fā)現(xiàn)文件頭的大小為4444的字節(jié)數(shù)組,然后標(biāo)準(zhǔn)的文件頭格式,將錄制音頻時(shí)wavwav音頻文件。與錄制指定長(zhǎng)度的音頻一樣,通過Timer和TimerTask來實(shí)現(xiàn)這個(gè)功能。首先分別創(chuàng)建一個(gè)Timer和TimerTask對(duì)象,在TimerTask的任務(wù)中,需要做的事情是開始后,Timer的周期設(shè)置為應(yīng)用設(shè)置中的“音頻長(zhǎng)度”與“間隔時(shí)間”之定的間隔時(shí)間,Timer循環(huán)就會(huì)自動(dòng)開始下一段。圖4.4為這個(gè)過程的示意圖。圖4.4連續(xù)錄制多段音頻示意圖通過以上方法,就達(dá)到了連續(xù)錄制多段音頻的目標(biāo),同時(shí)每一段都是在一添加一個(gè)成員函數(shù)readWav,用于wav音頻文件并進(jìn)行預(yù)處理。數(shù)據(jù),使用Java語言的DataInputStream類創(chuàng)建文件讀入流來處理wav音頻文件。DataInputStream支持直接long,int,short,char等類型的數(shù)據(jù),并可以通過skipBytes首先wav音頻文件的文件頭,由于只需要幾個(gè)特定的音頻參數(shù),如采樣頻率、聲道、量化位數(shù)等。因此,可以參照附錄A中標(biāo)準(zhǔn)wav音頻文件的文件頭格式,使用skipBytes函數(shù)跳過不需要的字節(jié),直接獲取所需的參數(shù)。然后,假設(shè)wav音頻文件的數(shù)據(jù)部分大小為N個(gè)字節(jié),采樣點(diǎn)數(shù)為m。需要表4.1所示。表4.1大小相同參數(shù)不同的WAV音頻8N8mdoubleaudioValue來保存最終結(jié)果,并用來傳遞給音頻指由于提取音頻的過需要進(jìn)行大量的運(yùn)算,為了提高程序的運(yùn)行效率,音頻時(shí)將返回的音頻保存在文本文件中。構(gòu)建C++音頻提取算法動(dòng)態(tài)庫時(shí),需要做一些額外的工作。publicnativestaticint[]getFp(double[]audioValue,intfrequency);audioValue為對(duì)wavfrequency為wav音頻文件的采樣頻率。getFp函數(shù)的返回值是一個(gè)intwav音頻文件的音頻。magicadC++AudioJNIgetFp函數(shù),并完成參數(shù)類型的轉(zhuǎn)換。主要代碼如圖4.5所示。圖4.5C++接口函數(shù)主要代碼首先需要引入JNI頭文件“jni.h”和音頻提取算法頭文件“Fingerextract.h”,述代碼中_felix_magicad_AudioJNI_getFpAudioJNI類中的getFp函4.2是對(duì)代碼中用到的表4.2JAVA數(shù)據(jù)類型與JNI數(shù)據(jù)類型的轉(zhuǎn)換對(duì)照 對(duì)它的,才能將這些參數(shù)傳遞給音頻提取算法。在上面的代碼中,采用的數(shù)組fp中以返回給Java代碼。 完成接口的編寫后還需要將C++接口文件和所有音頻提取算法的C++代碼構(gòu)建(),用于在程序中進(jìn)行快速變換。雖然FFTW提供了可以Linux、WindowsAndroid設(shè)備的處理器架構(gòu)與平臺(tái)的庫,最終得到一個(gè)頭文件fftw3.hlibfftw3.a。選中的文件為音頻提取算法所包含的C++頭文件(.h)和C++源文件(.cpp)。magicad.cppJNI接口文件,fftw3FFTW圖4.6C++文件列表FFTW庫,需要使PREBUILT_STATIC_LIBRARY將其預(yù)構(gòu)建fftw3Android.mk4.7所示。圖4.7FFTW3MAKEFILE文件描述其中LOCAL_MODULE為得到的靜態(tài)庫的名稱,LOCAL_SRC_FILES指明進(jìn)行Android.mk文件,就可以將fftw3.hlibfftw3.a一起預(yù)構(gòu)建成靜態(tài)庫fftw3。最后在音頻提取算法源文件所在的 的Android.mk文件,其內(nèi)容如圖4.8所示。圖4.8所有C++文件的MAKEFILE文件描述參數(shù)。同時(shí),通過下面這條規(guī)則了fftw3文件夾中的Android.mk文件:include$(callall-subdir- 描述,構(gòu)建音頻提取算法動(dòng)態(tài)庫libmagicad.so。如圖4.9所示。圖4.9SO動(dòng)態(tài) 圖4.10SO動(dòng)態(tài)庫的使用方法頻的頻率作為參數(shù)傳遞給AudioJNI類的getFp函數(shù),就可以進(jìn)行音頻的提取。該算法提取了兩個(gè)大小不同的音頻,第一個(gè)的大小為256位,第二個(gè)的大小為32*256位,其合并到了一個(gè)大小為256+32*256的數(shù)組中。得到返回的數(shù)組后,再將數(shù)組中的兩個(gè)音頻分別保存到兩個(gè)文本文件中。會(huì)返回一個(gè)與該電視相關(guān)的url地址,用于在客戶端中進(jìn)行瀏覽。若匹配失敗,則匹配時(shí),是使用已有的通信模塊將保存音頻的文本文件發(fā)送到服務(wù)器端。其中通信模塊提供了一個(gè)SocketHelper類,只需要將這個(gè)類加入到匹配客戶端的項(xiàng)SocketHelpersocket=new同時(shí),服務(wù)器端對(duì)音頻進(jìn)行匹配后,send函數(shù)會(huì)返回一個(gè)字符串:Stringresult= 表匹配成功,此時(shí)result的值是一個(gè)與成功匹配的內(nèi)容相關(guān)的url地址。同時(shí),Android提供了一系列的方法來簡(jiǎn)化使用數(shù)據(jù)庫的過程。下面講述返回失敗標(biāo)志。因此只需要在數(shù)據(jù)庫中保存匹配結(jié)果的時(shí)間、結(jié)果標(biāo)志和附加。其詳細(xì)設(shè)計(jì)如表4.3所示。表4.3數(shù)據(jù)庫表的設(shè)否是否否否否能否類圖如圖4.11所示。圖4.11DBHELPER類圖其中,DB_NAME為數(shù)據(jù)庫的名稱,DB_VER為數(shù)據(jù)庫的版本,TB_RESULTS為表的名稱,DB_CREATE為創(chuàng)建數(shù)據(jù)庫時(shí)的SQL語句。在onCreate中進(jìn)行數(shù)據(jù)庫SQL4.12圖4.12創(chuàng)建匹配結(jié)果表的SQL語句且可以通過ContentResolver進(jìn)行查詢和執(zhí)行事務(wù)。publicclassResultProviderextends在ResultProvider中,需要重寫onCreate方法來初始化底層的數(shù)據(jù)源,同時(shí)通query、update、delete、insertgetTypeContentResolver與數(shù)據(jù)進(jìn)行ResultProvider的類圖如圖4.13所示圖4.13RESULTPROVIDER類圖同Activity和Service一樣,ContentProvider必須在Manifest文件中進(jìn)行。否則,ContentResolver將無法找到ContentProvider。代碼如下所示:Android:authorities="com.felix.resultprovider">圖4.14MATCHRESULT類圖其中,date為日期信息,是通JavaDate類獲取當(dāng)前日期并格式化得到的;result為結(jié)果描述;link為附加的URL。result和link都是在MatchResult類的構(gòu)造函數(shù)然后在需要添加匹配結(jié)果的類中創(chuàng)建一個(gè)函數(shù)addResult。addResult函數(shù)使用一個(gè)MatchResult對(duì)象作為參數(shù),并在其中調(diào)用ResultProvider的insert函數(shù)將匹配結(jié)果最終,在獲得匹配結(jié)果之后,使用其結(jié)果描述和URL作為參數(shù)新建一個(gè)來異步加載數(shù)據(jù)和底層數(shù)據(jù)源的變化。CursorLoader是Loader的一個(gè)擴(kuò)展,允許ContentProviderCursor,而且對(duì)底層提供的任何更。通過LoaderManager可以在每個(gè)Activity或Fragment中使用CursorLoader在將加載的類型顯式地指定為Cursor。。publicstaticclassHistoryFragmentextendsLoaderCallback由以下3個(gè)處理程序組成: oader:當(dāng)Loader被初始化后,調(diào)用onCrea 該創(chuàng)建并返回一個(gè)新的CursorLoader對(duì)象。OnLoadFinished:當(dāng)LoaderManager已經(jīng)完成了異步查詢后,onLoadFinished配器和其它UI元素。onLoaderReset:當(dāng)LoaderManager重置CursorLoader的時(shí)候,會(huì)調(diào)用且重置相應(yīng)的UI。圖4.15HISTORYFRAGMENT類圖為了將所有匹配結(jié)果加載到HistoryFragment的列表視圖中。需要先在History圖,同時(shí)指定需要使用的Cursor。LoaderonLoadFinishedCursor與原來的結(jié)adapter也會(huì)在CursorHistoryFragment的內(nèi)本章主要講述了客戶端各個(gè)模塊的具體實(shí)現(xiàn)方法。4.1節(jié)講述了在實(shí)現(xiàn)客戶端的過所使用的開發(fā)環(huán)境和版本。4.2節(jié)、4.3節(jié)和4.4節(jié)分別講述了利用相關(guān)的技術(shù)和知識(shí)實(shí)現(xiàn)客戶端用戶界面模塊、功能模塊和數(shù)據(jù)庫模塊的方法。客戶端試和驗(yàn)證。首先介紹實(shí)驗(yàn)的環(huán)境,然后分別對(duì)各個(gè)模塊進(jìn)試,并驗(yàn)證客戶端的根據(jù)需要,在真實(shí)的Android設(shè)備上對(duì)客戶端進(jìn)試和驗(yàn)證,下面是實(shí)驗(yàn)環(huán)CPU:MTK8312ARMCortex-A72、環(huán)境操作系統(tǒng):Android數(shù)據(jù)庫管理工具: al將安裝文件(.apk)到Android設(shè)備的卡中從圖中可以發(fā)現(xiàn),客戶端請(qǐng)求了“”、“讀寫SD卡”和“網(wǎng)絡(luò)”等權(quán)限,與在實(shí)現(xiàn)過所需的權(quán)限一致。圖5.1項(xiàng)目源文件結(jié)構(gòu)圖5.2安裝提示生成Android應(yīng)用程序安裝文件。同時(shí)在Android設(shè)備上安裝匹配客戶端時(shí),成功5.3可以發(fā)現(xiàn),首頁界面的布局和“開始”按鈕的形狀都與圖5.3首頁界面界面和歷史記錄界面,實(shí)驗(yàn)結(jié)果如圖5.4所示。圖5.4TAB選項(xiàng)卡“確定”按鈕才會(huì)完全退出程序,實(shí)驗(yàn)結(jié)果如圖5.5所示。圖5.5退出知,其實(shí)驗(yàn)結(jié)果如圖5.6所示。圖5.6通知3、驗(yàn)證結(jié)果展示界面。將“

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論