版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
音樂(lè)電臺(tái)APP的設(shè)計(jì)與實(shí)現(xiàn)摘要由于移動(dòng)互聯(lián)網(wǎng)的推廣,各類音樂(lè)電臺(tái)軟件成為用戶手機(jī)上常用的APP,個(gè)性化推薦無(wú)疑是音樂(lè)播放器的基本功能。以用戶口味為導(dǎo)向的音樂(lè)推薦,成為個(gè)性化推薦板塊中最典型的應(yīng)用。針對(duì)數(shù)字音樂(lè)服務(wù),不管音樂(lè)下載還是互聯(lián)網(wǎng)音樂(lè)電臺(tái),背后均要有合格的推薦系統(tǒng)。一套優(yōu)質(zhì)的音樂(lè)推薦系統(tǒng),是社交網(wǎng)絡(luò)平臺(tái)極為關(guān)鍵的部分。本文分析和概括了音樂(lè)電臺(tái)推薦系統(tǒng)自身的功能需求及其可行性。圍繞系統(tǒng)設(shè)計(jì)了各個(gè)功能模塊,結(jié)合開(kāi)發(fā)框架來(lái)建立全新的架構(gòu)。系統(tǒng)架構(gòu)上,電臺(tái)信息管理子系統(tǒng)均是選擇B/S體系結(jié)構(gòu)來(lái)進(jìn)行設(shè)計(jì),推薦服務(wù)能夠?qū)δ芙M件進(jìn)行編譯,并以動(dòng)態(tài)庫(kù)插件的形式分布于服務(wù)器上,確保業(yè)務(wù)的可擴(kuò)展性。而移動(dòng)客戶端,是以Android系統(tǒng)開(kāi)發(fā)為依托的一款音樂(lè)電臺(tái)播放APP。經(jīng)過(guò)功能以及性能測(cè)試,本系統(tǒng)已能為用戶提供個(gè)性化推薦,在移動(dòng)端智能地播放推薦的各類歌曲。測(cè)試時(shí),個(gè)性化推薦也得到了體現(xiàn),適應(yīng)系統(tǒng)預(yù)期的各個(gè)功能點(diǎn)。系統(tǒng)性能測(cè)試上,系統(tǒng)運(yùn)行基本符合可靠性以及穩(wěn)定性這兩項(xiàng)要求,適合投入使用。關(guān)鍵詞:音樂(lè)電臺(tái)APP;推薦系統(tǒng);模塊設(shè)計(jì);功能實(shí)現(xiàn)目錄TOC\o"1-3"\h\u61751相關(guān)技術(shù)分析 4257541.1Android常用組件 428401.2MVC設(shè)計(jì)模式 4232931.3圖片顯示框架 5111662音樂(lè)電臺(tái)APP需求分析 565222.1音樂(lè)電臺(tái)推薦服務(wù)需求分析 537392.2音樂(lè)電臺(tái)安卓客戶端需求分析 664772.3系統(tǒng)性能需求分析 721533音樂(lè)系統(tǒng)功能設(shè)計(jì) 7259023.1系統(tǒng)功能設(shè)計(jì) 7237083.2系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì) 979693.3音樂(lè)電臺(tái)信息管理子系統(tǒng)詳細(xì)設(shè)計(jì) 11266033.4音樂(lè)電臺(tái)推薦服務(wù)詳細(xì)設(shè)計(jì) 13142703.5音樂(lè)電臺(tái)安卓客戶端詳細(xì)設(shè)計(jì) 14288524音樂(lè)電臺(tái)推薦系統(tǒng)實(shí)現(xiàn) 16299304.1音樂(lè)電臺(tái)信息管理子系統(tǒng)實(shí)現(xiàn) 1631704.2推薦服務(wù)實(shí)現(xiàn) 19228144.3安卓客戶端實(shí)現(xiàn) 23182074.3.5搜索功能模塊實(shí)現(xiàn) 2922085音樂(lè)電臺(tái)APP系統(tǒng)功能測(cè)試 30292945.1音樂(lè)電臺(tái)推薦服務(wù)功能測(cè)試 30305295.2音樂(lè)電臺(tái)安卓客戶端功能測(cè)試 301444結(jié)論 3117896參考文獻(xiàn) 321相關(guān)技術(shù)分析1.1Android常用組件Activity是在手機(jī)端與用戶交互的可視化界面,通過(guò)點(diǎn)擊不同的頁(yè)面可以實(shí)現(xiàn)不同頁(yè)面之間的跳轉(zhuǎn)。一個(gè)完整的Activity必須在在清單文件(AndroidManifest.xml)里的配置才能啟動(dòng)這個(gè)Activity。在清單文件中<application>節(jié)點(diǎn)里面是控制著整個(gè)Activity運(yùn)行的狀態(tài)的基礎(chǔ),可設(shè)置當(dāng)前啟動(dòng)Activity的屬性,包括圖標(biāo)、安裝APP后手機(jī)上顯示的名字、是否具有標(biāo)題欄等等,如果沒(méi)有配置圖標(biāo)、顯示名字的屬性,則會(huì)使用開(kāi)發(fā)工具在<application>里默認(rèn)生成里的屬性。ServiceAndroid系統(tǒng)進(jìn)程有五個(gè)優(yōu)先級(jí),分別是Foregroundprocess、Visibleproces、Serviceprocess、Backgroundprocess、Emptyprocess,其中Service進(jìn)程處于第三個(gè)等級(jí)。在Android手機(jī)端能通過(guò)設(shè)置里查看到應(yīng)用運(yùn)行在后臺(tái)的服務(wù),開(kāi)啟服務(wù)有兩種方式bindService()和startService()。通過(guò)StartService()開(kāi)啟的服務(wù)能一直處于手機(jī)后臺(tái)運(yùn)行,能提升應(yīng)用的優(yōu)先級(jí),即使當(dāng)前的Activity不存在,依然在運(yùn)行,能發(fā)揮出一些特定的作用。1.2MVC設(shè)計(jì)模式在Anroid開(kāi)發(fā)APP中常采用MVC(Model-View-Controller)設(shè)計(jì)模式,這種模式在Java開(kāi)發(fā)中也被廣泛的使用。模型(Model)是整個(gè)應(yīng)用的重要部分,用來(lái)存放著應(yīng)用的實(shí)體類對(duì)象,封裝各種類型的數(shù)據(jù),完成對(duì)用戶發(fā)送請(qǐng)求后返回?cái)?shù)據(jù)的處理,而不用去關(guān)心用戶界面相關(guān)的邏輯,對(duì)于一些耗時(shí)的操作也可放在該部分里;視圖(View)是向用戶展示整個(gè)界面,這其中需用到xml布局文件,常見(jiàn)的布局有LinearLayout、RelativeLayout等,在布局文件中可設(shè)置各種類型的控件,如TextView、Button、RecyclerView等控件,主要用于用戶交互的作用,并通過(guò)Adapter(適配器)將數(shù)據(jù)顯示在用戶界面上;控制器(Controller)充當(dāng)調(diào)度的作用,由Activity與Fragment來(lái)組成,管理著視圖與模型兩個(gè)層面的交互,完成數(shù)據(jù)交互間的業(yè)務(wù)邏輯,并將結(jié)果在界面供用戶查看。MVC的設(shè)計(jì)模式提高了代碼的復(fù)用,減少了代碼之間的過(guò)度關(guān)聯(lián),開(kāi)發(fā)與維護(hù)的成本變低。1.3圖片顯示框架手機(jī)應(yīng)用上都有各種各樣的圖片,有許多優(yōu)秀的框架能很好的處理圖片顯示。Glide是2014年的GoogleI/O大會(huì)所推薦使用的圖片加載庫(kù),在AndroidStudio中只需添加簡(jiǎn)單的依賴就可使用,支持對(duì)大多數(shù)的圖片格式的處理,是在Picasso框架基礎(chǔ)上開(kāi)發(fā)的。日常生活中看到的gif動(dòng)圖都也可用Glide來(lái)處理,觀看圖片顯示時(shí)具有平滑效果、漸進(jìn)式的動(dòng)畫樣式展示,提升了視覺(jué)上的體驗(yàn),并支持網(wǎng)絡(luò)、本地磁盤、項(xiàng)目目錄資源等多種數(shù)據(jù)資源的處理,使用了LRU(LeastRecentlyUsed)的算法處理磁盤上的緩存,將用戶最近很少用到的數(shù)據(jù)從緩存中移除來(lái)增加更多的存儲(chǔ)空間,因而減少了對(duì)手機(jī)內(nèi)存的消耗,預(yù)加載功能提高圖片顯示的速度。2音樂(lè)電臺(tái)APP需求分析音樂(lè)電臺(tái)推薦系統(tǒng),即基于多媒體的一類移動(dòng)應(yīng)用APP。該系統(tǒng)涵蓋了3個(gè)關(guān)鍵的部分:①音樂(lè)信息管理子系統(tǒng),對(duì)用戶、歌曲信息進(jìn)行管理;②音樂(lè)電臺(tái)推薦系統(tǒng),結(jié)合用戶平時(shí)的聽(tīng)歌習(xí)慣,構(gòu)建相應(yīng)的偏好模型,同時(shí)向他們定向地推薦歌曲;③音樂(lè)電臺(tái)手機(jī)客戶端,其最大的功能在于音樂(lè)播放。2.1音樂(lè)電臺(tái)推薦服務(wù)需求分析音樂(lè)電臺(tái)推薦服務(wù),功能是統(tǒng)計(jì)用戶每日的聽(tīng)歌流水,構(gòu)建聽(tīng)歌偏好模型,從歌曲基因庫(kù)中檢索到合適的歌曲,將它們推薦給用戶,如圖2-1。圖2-1音樂(lè)電臺(tái)推薦服務(wù)用例圖用戶聽(tīng)歌流水統(tǒng)計(jì):接收聽(tīng)歌流水資料,并進(jìn)行上報(bào)。對(duì)上報(bào)結(jié)果予以劃分,將它們分為聽(tīng)歌時(shí)長(zhǎng)、正向以及負(fù)向操作,將上報(bào)數(shù)據(jù)存儲(chǔ)于緩存組件中,以便對(duì)偏好模型進(jìn)行計(jì)算。偏好模型計(jì)算:結(jié)合上報(bào)的資料,按用戶自己的聽(tīng)歌時(shí)長(zhǎng)、正及負(fù)向操作具體的權(quán)重,計(jì)算他們?cè)跉v史數(shù)據(jù)中分?jǐn)?shù)最多的歌曲。以該類歌曲為藍(lán)本,推薦類似風(fēng)格的歌曲,構(gòu)建不喜歡的曲目列表。相似歌曲查詢:查找得分最多的歌曲基因,如歌手、流派,將其納入候選列表中,從不喜歡歌手曲目中對(duì)部分歌曲進(jìn)行過(guò)濾。從候選列表中篩選出10首,將其納入推薦歌曲。假設(shè)列表中的曲目<10首,需要選擇其他新歌手予以補(bǔ)齊。其它功能:數(shù)據(jù)庫(kù)檢索要耗費(fèi)很多的時(shí)間,為防止對(duì)數(shù)據(jù)庫(kù)頻繁地查找,推薦服務(wù)也會(huì)定時(shí)地在緩存組件中保存這些歌曲信息。在后續(xù)對(duì)相似歌曲進(jìn)行查找時(shí),用戶在緩存組件中就能完成,而無(wú)需再依賴數(shù)據(jù)庫(kù),這就降低了訪問(wèn)次數(shù)。2.2音樂(lè)電臺(tái)安卓客戶端需求分析音樂(lè)電臺(tái)安卓客戶端,有6個(gè)基本的功能:用戶登錄注冊(cè),音樂(lè)播放控制,音樂(lè)頻譜以及歌詞同步顯示,同時(shí)包括播放列表、屬性設(shè)置。其用例圖如圖2-2。圖2-2安卓客戶端用例圖用戶注冊(cè)登錄:用戶登錄系統(tǒng)之前需先完成注冊(cè),用戶需要一個(gè)ID,它相當(dāng)于標(biāo)識(shí),當(dāng)然用戶也可直接登錄QQ。控制歌曲播放:對(duì)正在播放的音樂(lè)加以控制,比如播放不同的歌曲、暫停、調(diào)節(jié)播放器音量等。過(guò)切換歌曲需上報(bào)給服務(wù)器,該操相當(dāng)于跳過(guò)歌曲,表示用戶對(duì)該歌曲不感興趣。顯示音樂(lè)頻譜:音樂(lè)頻譜動(dòng)畫可采用以下兩種方式顯示出來(lái):其一為波形圖;其二為柱狀圖。用戶通過(guò)設(shè)置屬性對(duì)頻譜顯示方式進(jìn)行設(shè)置,同時(shí)還能對(duì)音頻捕獲頻率進(jìn)行設(shè)置。同步顯示音樂(lè)歌詞:可顯示歌詞,對(duì)歌詞文件進(jìn)行解析,滾動(dòng)播放歌曲。未出現(xiàn)對(duì)應(yīng)的歌詞,通常顯示的是默認(rèn)圖片。操作播放列表:用戶通過(guò)收聽(tīng)、收藏歌曲或?qū)⑵鋭h除,并向服務(wù)器上報(bào)這些操作,它關(guān)系到用戶喜好模型能否成功建立。設(shè)置播放屬性:對(duì)播放器的屬性進(jìn)行設(shè)置,比如頻譜顯示為柱狀圖還是波形。聽(tīng)歌流水上報(bào):如實(shí)上報(bào)聽(tīng)歌時(shí)長(zhǎng),并對(duì)聽(tīng)歌數(shù)據(jù)進(jìn)行統(tǒng)計(jì),完成聽(tīng)歌偏好模型的建立。2.3系統(tǒng)性能需求分析本項(xiàng)目相當(dāng)于音樂(lè)電臺(tái)推薦,它是在安卓移動(dòng)APP的基礎(chǔ)上建立的。性能需求指標(biāo)通常表現(xiàn)為推薦服務(wù)所需的響應(yīng)時(shí)間,包括服務(wù)并發(fā)性、穩(wěn)定性等。并發(fā)性表現(xiàn)為推薦服務(wù)能夠?qū)υ诰€用戶數(shù)量提供支持。性能需求主要側(cè)重于推薦算法所能達(dá)到的運(yùn)行速度,包括系統(tǒng)的用戶數(shù)、客戶端顯示頻譜,以及歌詞的內(nèi)存大小。頁(yè)面響應(yīng)時(shí)間:通過(guò)統(tǒng)計(jì)分析一般管理系統(tǒng)的響應(yīng)時(shí)間,使系統(tǒng)管理頁(yè)面控制在5秒以內(nèi)的響應(yīng)時(shí)間,保證用戶能在3秒內(nèi)獲取推薦內(nèi)容。穩(wěn)定性:這里所說(shuō)的系統(tǒng)穩(wěn)定性,即推薦服務(wù)可以響應(yīng)用戶提出的請(qǐng)求,將歌曲推薦給用戶。中間不存在系統(tǒng)奔潰、內(nèi)存泄露等情況,服務(wù)的運(yùn)行時(shí)間超過(guò)半年,無(wú)需人工干預(yù)。并發(fā)性:對(duì)于后臺(tái)推薦服務(wù)來(lái)說(shuō),可支持最大的用戶數(shù)量。處于穩(wěn)定運(yùn)行狀態(tài)下的推薦服務(wù),當(dāng)系統(tǒng)負(fù)載達(dá)到最大時(shí),響應(yīng)時(shí)間不會(huì)超過(guò)用戶所能接受的范圍。精準(zhǔn)性:結(jié)合以往的聽(tīng)歌數(shù)據(jù),根據(jù)當(dāng)前的曲庫(kù),選出目前用戶比較熱衷的歌曲,向用戶推薦這些歌曲。不斷增加用戶聽(tīng)歌數(shù)據(jù)之后,推薦的歌曲與用戶的口味越來(lái)越相符。3音樂(lè)系統(tǒng)功能設(shè)計(jì)3.1系統(tǒng)功能設(shè)計(jì)3.1.1音樂(lè)電臺(tái)信息管理子系統(tǒng)結(jié)構(gòu)設(shè)計(jì)用戶信息管理系統(tǒng)、音樂(lè)大都以業(yè)務(wù)為主,且其功能主要是增刪改查用戶信息及音樂(lè)。該系統(tǒng)主要包括以下模塊:1.音樂(lè)管理;2.用戶信息管理;3.后臺(tái)用戶信息管理;4.系統(tǒng)管理。音樂(lè)管理主要用于維護(hù)音樂(lè)分類信息,系統(tǒng)用戶管理、普通用戶管理均可用于維護(hù)用戶信息。系統(tǒng)管理指的是,管理系統(tǒng)權(quán)限、操作備份數(shù)據(jù),為用戶提供相應(yīng)的使用指南。根據(jù)系統(tǒng)需求對(duì)模塊進(jìn)行劃分,同時(shí)結(jié)合系統(tǒng)用戶,得到圖3-1所示的功能模塊結(jié)構(gòu)。圖3-1信息管理子系統(tǒng)功能模塊圖3.1.2音樂(lè)電臺(tái)推薦服務(wù)結(jié)構(gòu)設(shè)計(jì)音樂(lè)電臺(tái)推薦與信息管理系統(tǒng)不同,它偏重計(jì)算這一業(yè)務(wù)邏輯。為了使推薦功能可以快速完成,采用C/C++語(yǔ)言對(duì)CGI進(jìn)行編寫,確保業(yè)務(wù)邏輯得以實(shí)現(xiàn)。音樂(lè)電臺(tái)推薦通過(guò)統(tǒng)計(jì)用戶聽(tīng)歌數(shù)據(jù),可加快歌曲偏好模型的建立,根據(jù)用戶喜好對(duì)相似歌曲進(jìn)行查找,將其推薦給用戶。常見(jiàn)的功能模塊有以下幾種類型:查詢相似歌曲基因、計(jì)算用戶偏好模型、上報(bào)處理用戶聽(tīng)歌流水。圖3-2為音樂(lè)電臺(tái)推薦的主要功能框架:圖3-2音樂(lè)電臺(tái)推薦服務(wù)功能框架圖查詢相似歌曲基因,即在音樂(lè)庫(kù)中找出用戶聽(tīng)歌數(shù)據(jù),且其經(jīng)過(guò)偏好模型計(jì)算得出,獲得最高評(píng)分?jǐn)?shù)據(jù)的歌曲與其他歌曲相比,具有相同的分類信息。這些歌曲可用作候選推薦歌曲,對(duì)其進(jìn)行過(guò)濾操作之后,再推薦給用戶。所謂用戶偏好模型,指的是根據(jù)相應(yīng)的評(píng)分規(guī)則,評(píng)價(jià)用戶所聽(tīng)歌曲,采用協(xié)同過(guò)濾算法,某個(gè)物品的評(píng)分最高,就表示該物品深受用戶的喜愛(ài)。由此可見(jiàn),評(píng)分計(jì)算方法是用戶偏好模型的關(guān)鍵。對(duì)用戶聽(tīng)歌進(jìn)行上報(bào)處理,即推薦服務(wù)通過(guò)解析用戶聽(tīng)歌數(shù)據(jù),使protobuf結(jié)構(gòu)體得以生成。存儲(chǔ)過(guò)程中,按照一定序列將protobuf結(jié)構(gòu)體變?yōu)樽址?,接著將其存于CMEM存儲(chǔ)組件內(nèi)。服務(wù)器具備處理用戶聽(tīng)歌、建立用戶偏好模型、查詢相似歌曲基因這三大功能,且其部署形式為CGI/FASTCGI,這樣音樂(lè)電臺(tái)才具備推薦服務(wù)功能。3.1.3音樂(lè)電臺(tái)手機(jī)客戶端結(jié)構(gòu)設(shè)計(jì)音樂(lè)電臺(tái)安卓客戶端相當(dāng)于一個(gè)多媒體播放[13]應(yīng)用APP。它具備播放音樂(lè)的功能,而且還能上報(bào)操作用戶聽(tīng)歌數(shù)據(jù),向用戶推薦各種歌曲。該客戶端具備以下六個(gè)功能模塊:1.用戶注冊(cè)登錄;2.控制音樂(lè)播放;3.顯示音樂(lè)頻譜;4.同步顯示歌詞;4.操作播放列表;5.設(shè)置功能屬性。操作播放列表主要表現(xiàn)為刪除、收聽(tīng)以及收藏歌曲,并向推薦服務(wù)上報(bào)相關(guān)歌曲。圖3-3為功能框架圖:圖3-3音樂(lè)電臺(tái)客戶端功能框架圖3.2系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)本系統(tǒng)將開(kāi)源的MySQL作為數(shù)據(jù)庫(kù),采用ORM框架持久化操作系統(tǒng)數(shù)據(jù)庫(kù),這樣不需要增刪改查關(guān)系數(shù)據(jù)庫(kù),而且無(wú)需編寫代碼,開(kāi)發(fā)工作量明顯減少,系統(tǒng)不僅增強(qiáng)了可擴(kuò)展性,其可維護(hù)性也被大大增強(qiáng)。按照系統(tǒng)的需求、業(yè)務(wù)流程對(duì)表格屬性進(jìn)行設(shè)計(jì),同時(shí)分析表與表之間存在怎樣的關(guān)聯(lián)。上一章節(jié)通過(guò)描述、分析各類需求,發(fā)現(xiàn)系統(tǒng)包含以下主體信息:1.普通用戶信息;2.系統(tǒng)用戶信息;3.歌曲基因信息。根據(jù)上述幾個(gè)實(shí)體類,可知系統(tǒng)數(shù)據(jù)庫(kù)的核心表主要涉及普通用戶、用戶鉆、歌曲、歌手、曲風(fēng)、流派、系統(tǒng)用戶、系統(tǒng)權(quán)限、權(quán)限分配這幾個(gè)方面。普通用戶信息主要分為用戶賬號(hào)、密碼。用戶性別、年齡以及上次登錄信息,與用戶歌曲推薦有著密切的關(guān)聯(lián)。歌曲推薦類型與用戶年齡、性別有很大的關(guān)系,上次登錄時(shí)間對(duì)推送歌曲也有一定的影響,應(yīng)避免推送的歌曲是用戶近段時(shí)間才聽(tīng)過(guò)的。各表間的相互關(guān)系如圖3-4所示:整個(gè)音樂(lè)電臺(tái)推薦系統(tǒng)的數(shù)據(jù)庫(kù)主要表結(jié)構(gòu)如下:(1)用戶信息表表名:UserInfo,表字段如表3-1所示:(2)權(quán)限信息表表名:Privilege,表字段如表3-2所示:表3-2Privilege表(3)系統(tǒng)用戶信息表表名:AdminInfo,表字段如表3-3所示:表3-3用戶信息表(4)權(quán)限分配表表名:Distribution,表字段如表3-4所示:表3-4Distribution表(5)歌手信息表表名:SingerInfo,表字段如表3-5所示:表3-5SingerInfo表3.3音樂(lè)電臺(tái)信息管理子系統(tǒng)詳細(xì)設(shè)計(jì)信息管理模塊可用于查詢、添加、修改以及刪除歌曲基因信息。Action包下主要有SongTypeAction、MelodyAction、SingerAction、SongInfoAction這幾種類型。Service包下分為SongTypeService、SongInfoService、MelodyOperService、SingerOperSerivce這幾類。DAO包下分為SongTypeDAO、MelodyDAO、SongOperDAO、SingerDAO這幾類,具體可參照以下幾點(diǎn):圖3-2SongOperDAO和SingerDAO類圖信息管理模塊具有添加、修改以及刪除歌曲基因信息的功能。修改、刪除歌曲信息時(shí),其時(shí)序圖類似于系統(tǒng)抽象時(shí)序,然而用于添加歌曲信息的時(shí)序圖卻不同于系統(tǒng)新建的時(shí)序。歌曲信息在添加過(guò)程中,需將基本信息添加到其中,同時(shí)還需添加曲風(fēng)類型、歌手信息以及流派類型,若缺少這些信息,必須先完成信息的添加。歌曲信息添加完之后,接下來(lái)就是歌曲文件的上傳。該歌曲如果含有歌詞文件,必須將歌詞文件上傳。圖3-3歌曲基因信息添加操作時(shí)序圖刪除歌曲信息分為兩個(gè)步驟,先刪除數(shù)據(jù)庫(kù)中的歌曲相關(guān)信息,再刪除服務(wù)器當(dāng)中的資源。刪除歌曲文件需用到運(yùn)行腳本,歌曲信息刪除與系統(tǒng)抽象刪除有著相同的時(shí)序圖。而歌手、曲風(fēng)以及歌手流派這幾個(gè)信息管理模塊與系統(tǒng)抽象時(shí)序圖保持一致,且其時(shí)序圖沒(méi)有特殊化。3.4音樂(lè)電臺(tái)推薦服務(wù)詳細(xì)設(shè)計(jì)3.4.1用戶聽(tīng)歌流水上報(bào)詳細(xì)設(shè)計(jì)用戶擁有龐大的聽(tīng)歌流水?dāng)?shù)據(jù),想要加快查詢速度,可用NoSql存儲(chǔ)所有的聽(tīng)歌行為數(shù)據(jù)。用戶聽(tīng)歌數(shù)據(jù)一般儲(chǔ)存在CMEM組件中,可對(duì)一些特定歌手、流派歌曲進(jìn)行查找。存儲(chǔ)音樂(lè)信息過(guò)程中,由于采用的是外鍵設(shè)計(jì),也就是說(shuō)查詢類型屬于整數(shù),這樣就能加快查詢速度。通常,用戶可將QQ號(hào)當(dāng)成存儲(chǔ)key值,而Value值采用的是經(jīng)protobuf序列化后的用戶數(shù)據(jù)結(jié)構(gòu)體,且其一般為字符串。對(duì)數(shù)據(jù)進(jìn)行提取時(shí),只需protobuf反序列化用戶數(shù)據(jù)。3.4.2相似歌曲基因查詢?cè)敿?xì)設(shè)計(jì)查詢相似歌曲基因,即查詢歌曲基因庫(kù)內(nèi)的歌手、歌曲曲風(fēng)以及流派等。目前,這部分并不能達(dá)到較高的自動(dòng)化程度,只能采用人工方式將歌曲基因信息錄入其中。結(jié)合之前所提到的推薦算法。設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),無(wú)論是歌手信息還是流派信息,亦或是曲風(fēng)信息,它們都有各自的ID,所以查詢速度非??臁榱四軌蚩焖俨樵兊较嗨聘枨?,可定期在CMEM中寫入差異數(shù)據(jù)。查詢這類歌曲信息時(shí),可在CMEM中直接查詢,也可在DB中查詢,這樣就能快速對(duì)相似歌曲進(jìn)行查詢。3.4.3用戶偏好模型計(jì)算詳細(xì)設(shè)計(jì)首次登錄系統(tǒng)的用戶在使用推薦功能過(guò)程中,由于沒(méi)有聽(tīng)歌歷史數(shù)據(jù),只能按聽(tīng)歌列表中的歌曲對(duì)歌手、曲風(fēng)進(jìn)行查找,以此找出具有較高相似度的歌曲。根據(jù)用戶聽(tīng)歌數(shù)據(jù),選出得分最高的歌曲,找出與這些歌曲有著相似基因的其它歌曲。分兩步對(duì)這些相似歌曲進(jìn)行篩選,并向用戶推薦這些歌曲。step1:將用戶不感興趣的歌曲過(guò)濾掉,通常刪除的歌曲會(huì)存儲(chǔ)在聽(tīng)歌歷史記錄中,包括一些歌手信息等。對(duì)于同一歌手,如果刪除的歌曲超過(guò)三首,候選歌曲列表1不會(huì)再出現(xiàn)該歌手的任何歌曲,只能出現(xiàn)在候選列表2,這樣就進(jìn)入了step2。step2:結(jié)合用戶行為數(shù)據(jù),建立相應(yīng)的隱性評(píng)分模型。若用戶從未聽(tīng)過(guò)推薦的歌曲,那么該歌曲就會(huì)得到默認(rèn)的分值。若用戶對(duì)推薦的歌曲比較熟悉,可按照以下計(jì)算規(guī)則對(duì)歌曲分值進(jìn)行計(jì)算。最后,向用戶推薦5首分值最高的歌曲。通常,可采用推薦算法來(lái)計(jì)算單曲的分值,其中包括紅心、刪除以及下載,還包括收藏、點(diǎn)歌以及分享,此外還有聽(tīng)歌流水等。操作不同,對(duì)評(píng)分系統(tǒng)的影響也不一樣,表3-6表示每項(xiàng)操作所得到的評(píng)分值,以及權(quán)重值(最低為0分,最高為10分:表3-6各個(gè)操作對(duì)應(yīng)的分值和權(quán)重3.5音樂(lè)電臺(tái)安卓客戶端詳細(xì)設(shè)計(jì)安卓客戶端具有播放音樂(lè)、顯示歌詞、顯示音樂(lè)頻譜、上報(bào)用戶操作等功能。Android操作系統(tǒng)是該客戶端能夠成功建立的基本前提。系統(tǒng)主要有Activity包、Adapter包以及Service包,還有MusicUtil包、Resource包以及LRC包。Activity包可以展示客戶端界面,它包括以下幾個(gè)類:AudioFxActivity類可顯示音樂(lè)頻譜,APP以MainActivity開(kāi)始動(dòng)畫,MediaPlayService可以控制音樂(lè)的播放,比如調(diào)節(jié)音量等,SongActivity類可以解析音樂(lè)信息,TabHostActivity能夠切換Tab界面。在Servic包中,MediaPlayService類相當(dāng)于音樂(lè)播放的關(guān)鍵類,它可以對(duì)歌曲的播放進(jìn)行控制。3.5.1用戶信息管理模塊詳細(xì)設(shè)計(jì)信息管理模塊主要用于增刪改查系統(tǒng)用戶信息。本模塊包括以下類:1.AdminAction類;2.AdminDAO類;3.AdminService類。添加或修改系統(tǒng)用戶信息,與新建、修改系統(tǒng)抽象基本相同。然而,刪除系統(tǒng)用戶信息與刪除系統(tǒng)抽象,二者具有不同的操作時(shí)序圖。這主要由于刪除系統(tǒng)用戶信息之后,必須將系統(tǒng)用戶權(quán)限也刪除,系統(tǒng)管理員可對(duì)系統(tǒng)用戶權(quán)限進(jìn)行回收分配。圖3-15分別對(duì)應(yīng)的是AdminAction以及AdminDAO類圖:圖3-4AdminAction和AdminDAO類圖3.5.2歌詞顯示模塊詳細(xì)設(shè)計(jì)歌詞顯示模塊可以將歌曲的歌詞同步顯示出來(lái),它在MediaPlayerService類中具有播放進(jìn)度功能,在DownLoadService中具有下載功能。播放歌曲期間,需查找相關(guān)歌詞文件,若存在的話,可在本地LRC目錄中下載LRC歌詞文件。接著,啟動(dòng)一個(gè)線程中的定時(shí)器,保持200毫秒的間隔時(shí)間,這樣才知道歌曲需要播放多久。當(dāng)然,也要與LRC歌曲文件相匹配,即保持相同的時(shí)間段,若能匹配上,可滾動(dòng)上一行,這樣就能顯示歌詞。圖2-6為歌詞顯示的時(shí)序圖:圖3-6歌詞同步顯示時(shí)序圖3.5.3頻譜顯示模塊詳細(xì)設(shè)計(jì)頻譜顯示功能主要將歌曲頻譜顯示出來(lái)。MediaPlayer組件含有一個(gè)Visualizer接口,它可以實(shí)現(xiàn)相關(guān)功能。OnDataCaptureListener接口需重寫的onWaveFormDataCapture()、onFftDataCapture,根據(jù)繪圖函數(shù)對(duì)相關(guān)數(shù)據(jù)進(jìn)行捕捉。頻譜顯示模塊主要分為以下類:1.VisualizerView類;2.AudioFxActivity類;3.MediaPlayerService類。圖2-7分別對(duì)應(yīng)的是AudioFxActivity類、VisualizerView類:圖3-7VisualizerView和AudioFxActivity類圖3.5.4播放列表操作模塊詳細(xì)設(shè)計(jì)播放列表操作這一模塊,主要記錄了用戶如何操作聽(tīng)歌列表,用戶主要有刪除、下載、收藏、標(biāo)注喜歡等操作行為。通過(guò)相推薦服務(wù)上報(bào)這些操作行為,以此對(duì)用戶偏好模型進(jìn)行計(jì)算。相關(guān)的類主要有:HttpMsgService類、DownLoadService類(用于下載歌曲)、TabHostActivity類,這樣就能切換多個(gè)Activity。此外,用戶操作列表也包含在TabHostActivity類當(dāng)中。4音樂(lè)電臺(tái)推薦系統(tǒng)實(shí)現(xiàn)各模塊及其功能實(shí)現(xiàn)中,以流程圖、相關(guān)方法,即可對(duì)模塊具體的實(shí)現(xiàn)過(guò)程加以描述。模塊中的某些關(guān)鍵功能,均有偽代碼,以注釋完成了詳解。4.1音樂(lè)電臺(tái)信息管理子系統(tǒng)實(shí)現(xiàn)電臺(tái)信息管理子系統(tǒng)共計(jì)4個(gè)模塊:音樂(lè)基因、普通用戶、后臺(tái)用戶信息以及系統(tǒng)管理模塊(針對(duì)文檔使用)。這里,我們將依次對(duì)各模塊不同的實(shí)現(xiàn)方法、流程圖加以介紹。4.1.1音樂(lè)電臺(tái)基因信息管理模塊實(shí)現(xiàn)基因信息管理模塊,重點(diǎn)是對(duì)音樂(lè)基因信息實(shí)施某基本的操作。如維護(hù),對(duì)歌曲進(jìn)行上下架或是其它各項(xiàng)操作。如:信息維護(hù)、流派特征篩選與增刪。唯有分配合適的權(quán)限,用戶才能正常行使模塊中的基本功能。本模塊用到了下列幾種不同的實(shí)現(xiàn)方法,如表4-1:表4-1音樂(lè)電臺(tái)基因信息管理模塊主要方法列表歌曲添加流程圖如下圖4-1所示:圖4-1歌曲添加流程圖4.1.2普通用戶信息管理模塊實(shí)現(xiàn)普通用戶管理模塊:維護(hù)用戶個(gè)人的信息。用戶信息相對(duì)來(lái)說(shuō)是保密的,僅賦予相關(guān)權(quán)限的部分管理人員,方可在線查看。對(duì)普通用戶信息來(lái)說(shuō),其刪除操作需要由系統(tǒng)管理員負(fù)責(zé),其重置流程,如圖3-2:圖4-2普通用戶信息重置流程圖普通用戶管理模塊主要實(shí)現(xiàn)方法列法如表3-2所示:表4-2普通用戶信息管理模塊主要方法列表用戶、歌曲基因信息,均是音樂(lè)APP最常規(guī)的操作。不少業(yè)務(wù)均需涉及到該類信息,從數(shù)據(jù)庫(kù)里面找到用戶的綠鉆以及歌曲基因信息。而這項(xiàng)操作耗時(shí)較長(zhǎng),很多時(shí)候成為系統(tǒng)的阻礙。正因?yàn)榇?,公司基于?nèi)存級(jí)別,研發(fā)出一款緩存組件CMEM。CMEM里面的數(shù)據(jù)可以存儲(chǔ)于內(nèi)存中,由多個(gè)服務(wù)器集群后進(jìn)行存儲(chǔ)。所以,我們一般會(huì)將綠鉆以及歌曲基因信息全部存儲(chǔ)于CMEM中,以Server形式來(lái)提供專業(yè)的查詢服務(wù),除了方便查詢外(與TCP套接字接口相兼容的語(yǔ)言,均可選擇該業(yè)務(wù)),同時(shí)也節(jié)約了很多的查詢時(shí)間。在錄入歌曲以及用戶綠鉆信息時(shí),需從TTC(MySQL集群)中對(duì)這些數(shù)據(jù)進(jìn)行更新,使其存儲(chǔ)于CMEM。4.1.3系統(tǒng)用戶信息管理模塊實(shí)現(xiàn)用戶信息管理模塊,功能是對(duì)后臺(tái)用戶信息進(jìn)行適當(dāng)?shù)卦鰟h。該步驟同樣也要設(shè)立合適的權(quán)限。管理人員唯有拿到這種權(quán)限后,方可進(jìn)行維護(hù)。用戶信息管理模塊,可按下列方法進(jìn)行實(shí)現(xiàn),如表4-3:表4-3系統(tǒng)用戶信息管理模塊主要方法列表圖4-3視頻區(qū)封裝的Bean以列表的方式體現(xiàn)表中內(nèi)容,結(jié)合數(shù)據(jù)長(zhǎng)度選擇合適的屏幕,是程序開(kāi)發(fā)必備的組件。4.1.4系統(tǒng)管理模塊實(shí)現(xiàn)系統(tǒng)管理模塊涵蓋了下列基本的功能:權(quán)限維護(hù)、分配以及數(shù)據(jù)備份。而權(quán)限分配,指的是管理員可以對(duì)用戶日常的操作權(quán)限進(jìn)行分配,或予以收回。子系統(tǒng)權(quán)限,即除了擴(kuò)大某些基礎(chǔ)的新功能外,也可以對(duì)系統(tǒng)里面的列表信息予以更新。數(shù)據(jù)備份,實(shí)質(zhì)上是對(duì)數(shù)據(jù)庫(kù)里面的重要表進(jìn)行備份。本系統(tǒng)管理模塊及其常用的實(shí)現(xiàn)方法,如表4-4:表4-4系統(tǒng)管理模塊主要方法列表4.2推薦服務(wù)實(shí)現(xiàn)4.2.1用戶聽(tīng)歌流水上報(bào)實(shí)現(xiàn)聽(tīng)歌以及操作流水信息,均是以protobuf結(jié)構(gòu)的形式存儲(chǔ)于緩存組件CMEM內(nèi)。CMEM屬于集群,在保存用戶信息時(shí)也要用到L5組件。此時(shí),L5結(jié)合業(yè)務(wù)供應(yīng)的modid、cmdid可以對(duì)集群上的某個(gè)臺(tái)機(jī)器進(jìn)行部署,符合一致性哈希。//獲取分配的IP和portl5_get_info(intmodid,intcmdid,string&host,int&port){if(!l5_init){//確保只初始化一次m_l5_client.init(modid,cmdid);l5_init=true;}intiRet=m_l5_client.get(host,port);//向模調(diào)監(jiān)控系統(tǒng)上報(bào)分配結(jié)果m_l5_client.report(iRet);;returniRet;;}用戶聽(tīng)歌流水,我們?cè)?.6.1章節(jié)中早就提及。上報(bào)消息,實(shí)質(zhì)上為OperMsg序列化完成后的JSON,以HTTP的形式將其上報(bào)至推薦服務(wù)中,OperReport類可以對(duì)HTTP包進(jìn)行解析,得到protobuf對(duì)應(yīng)的類,將protobuf的類予以序列化,保存于CMEM中。偽代碼:intHandleProcess(){//解包,把用戶請(qǐng)求的字符串解析出來(lái)ParseFromString(request,reportData);//校驗(yàn)MD5值是否正確ifVerifyMD5()為真then//用戶操作protobuf結(jié)構(gòu)賦值操作fill_CProUserActRec(reportData,userActRec);//將protobuf對(duì)應(yīng)類序列化為字符串Serliz2String(userActRec,str_data);//寫入CMEM組件Cmem.set(uin,str_data);return0;elsereturn-1;//返回錯(cuò)誤碼}在滑動(dòng)屏幕兩側(cè)時(shí),實(shí)現(xiàn)亮度的以及音量的調(diào)節(jié)。根據(jù)上下移動(dòng)的距離占屏幕高的百分比控制音量、亮度,并在屏幕中央的顯示框中顯示調(diào)節(jié)時(shí)的具體數(shù)值,音量、亮度會(huì)根據(jù)數(shù)字的大小變化而變化,在調(diào)節(jié)亮度、音量值為0和100時(shí)做出對(duì)應(yīng)的提示,并且是無(wú)法繼續(xù)下滑減少、上滑增加數(shù)量值。手勢(shì)滑動(dòng)主要分為三種情況,左邊區(qū)域上下滑動(dòng)、右邊區(qū)域上下滑動(dòng)、橫向滑動(dòng)視頻播放的進(jìn)度條,需在view.onScroll()滑動(dòng)事件里做好判斷,然后才能處理好音量、亮度、進(jìn)度條的正確邏輯。圖5-6展示了通過(guò)手勢(shì)滑動(dòng)來(lái)調(diào)節(jié)視頻播放時(shí)的音量以及亮度的效果。其實(shí)現(xiàn)效果圖如下:4.2.2用戶歌曲推薦算法實(shí)現(xiàn)在CGI中的HandleProcess()方法中已運(yùn)用微線程技術(shù),在實(shí)現(xiàn)線程中進(jìn)行調(diào)度,不需要任何的內(nèi)核參與,這就節(jié)約了切換線程耗費(fèi)的時(shí)間。偽代碼:intHandleProcess(){//解包,把用戶請(qǐng)求的字符串解析出來(lái)ParseFromString(userRequest);查找相似歌曲:以歌曲ID為例,從cmem內(nèi)查找并檢索與它最為相似的歌曲(曲風(fēng)、歌手這些信息,都已結(jié)合用戶自身的偏好比來(lái)計(jì)算出分?jǐn)?shù))l5_get_info(host,ip);//獲取動(dòng)態(tài)分配的IP和Port,實(shí)現(xiàn)均衡負(fù)載//在指定的機(jī)器上的查找與歷史歌曲基因相似歌曲LookupSimSong(host,ip,historySong,data);//CMEM是一種緩存組件,其形式為Key-Value,抽取Value后便完成了反序列化,成為一種ProtoBuf結(jié)構(gòu)NewSongList.ParseFromString(data);過(guò)濾歌曲:從CMEM中獲取用戶操作行為數(shù)據(jù),主要用于過(guò)濾用戶今天已經(jīng)聽(tīng)過(guò)的歌曲和過(guò)濾掉用戶不喜歡的歌手的歌曲。//獲取用戶聽(tīng)歌歷史數(shù)據(jù)Get_HisSongInfo(HisSongInfo_map);該部分代碼,多用于對(duì)用戶不喜歡的曲目予以過(guò)濾,先找出歌曲屬性信息,記錄被刪除后的歌曲或是歌手信息。若是1名歌手有3首甚至更多的歌曲被刪除,系統(tǒng)則不會(huì)再推薦他演唱的任何歌曲。while(iter!=HisSongInfo_map.end())beginGet_Attr(iter->SongID,SongAttr);if(SongAttr[SongID].del())//如果該SongID被刪除beginsingerdel[singerid]++;//該歌曲對(duì)應(yīng)的歌手刪除次數(shù)+1delsong.insert(SongID);//將該歌曲插入到刪除列表中enditer++end歌曲評(píng)分重排序:根據(jù)評(píng)分值對(duì)推薦的歌曲進(jìn)行重新排序并選取前10首。if(score.size()>0&&candidates.size()<uiReqItemNum){在用戶的聽(tīng)歌歷史記錄中查找推薦的歌曲,并選取距離當(dāng)前時(shí)間最遠(yuǎn)的歌曲進(jìn)行推薦。Map<uint32_t,uin32_t>songlistenInfo_map;for(inti=0;i<candidates.size();++i){inttargetsongid=candidates[i].second;uint32_tmax=0xffffffff;//32位的最大值map<uint64_t,singleRadio_UserAct::CProActItem>::iteratorUserActItemIter=historylist.find(targetsongid);if(UserActItemIter!=historylist.end())//聽(tīng)歌流水中已經(jīng)有該歌曲的數(shù)據(jù){//按songlistenInfo_map的Value值開(kāi)始排序,將歌曲ID按序備份于candidates數(shù)組中。copy_song_with_sort(songlistenInfo_map,candidates);返回推薦歌曲信息:隨機(jī)對(duì)推薦歌曲予以排序,將candidates數(shù)組信息當(dāng)作消息體,將其反饋至客戶端。OutputMsg(){//對(duì)推薦歌曲隨機(jī)排序random_shuffle(candidates.begin(),candidates.end());//序列化為JSONSerialize2Json(candidates,data);Output(data);}推薦服務(wù)中的各大模塊,其代碼均會(huì)被編譯,并建立動(dòng)態(tài)庫(kù)。QZHTTP服務(wù)器,能夠?qū)υ搫?dòng)態(tài)庫(kù)插件進(jìn)行配置,使其以CGI或是FASTCGI的方式運(yùn)行。啟動(dòng)時(shí),實(shí)現(xiàn)預(yù)分配。當(dāng)請(qǐng)求量擴(kuò)增,進(jìn)程數(shù)量也會(huì)隨之增加。底層原理:以linux系統(tǒng)供應(yīng)的一組函數(shù):dlopen(),dlerror(),dlsym()以及dlclose()。歌曲推薦是在持續(xù)學(xué)習(xí),初期用戶還沒(méi)有什么太多的聽(tīng)歌數(shù)據(jù),推薦并不精準(zhǔn)。不過(guò),后期聽(tīng)歌次數(shù)和數(shù)據(jù)擴(kuò)增后,系統(tǒng)為用戶推薦的歌曲也將會(huì)更加迎合他們的口味。推薦步驟如圖4-8:圖4-8推薦算法流程圖4.3安卓客戶端實(shí)現(xiàn)用戶自己在線注冊(cè),或是用QQ號(hào)均可完成登錄。登入成功后,即可看到系統(tǒng)的主界面,選擇本地歌曲,或是利用系統(tǒng)推薦來(lái)播放其他的歌曲。單擊播放,就可以聽(tīng)到聲音。同時(shí),還可對(duì)列表進(jìn)行操作,或是將喜歡的歌曲上報(bào)給推薦服務(wù),計(jì)算他們的偏好。客戶端流程,如圖4-9:圖4-9播放器整體流程圖安卓客戶端運(yùn)行主界面如下圖4-10所示:圖4-10播放器主界面4.3.1播放控制模塊實(shí)現(xiàn)作為關(guān)鍵的音樂(lè)播放功能,選擇MediaPlayer類接口來(lái)對(duì)播放節(jié)奏予以控制。同時(shí),將播放當(dāng)作一個(gè)Service,為Activity提供專業(yè)的播放以及控制服務(wù)。在客戶端上,播放、暫停以及停止這幾個(gè)按鈕,均如圖4-11:圖4-11播放器控制按鈕各按鈕均是利用LinearLayout來(lái)完成管理,依次排列,同時(shí)調(diào)用setOrientation(horizontal)使其進(jìn)行水平分布。安卓客戶端上,和播放有關(guān)的各類操作均需要用到MediaPlayService類,如播放控制,同步顯示。利用Android系統(tǒng)已封裝的MediaPlayer接口類,本組件能夠提供多個(gè)接口,以實(shí)現(xiàn)多媒體播放。播放音樂(lè)一般是在后臺(tái)工作,MediaPlayService也保留了Service。從根本上看,它啟動(dòng)了后臺(tái)進(jìn)程。Activity在對(duì)MediaPlayService進(jìn)行操作時(shí),要借助ServiceConnection對(duì)象來(lái)將Service予以綁住。Service中,需要用到onBind()、onUnbind()以及onRebind()這些不同的方法。MediaPlayService類相關(guān)代碼實(shí)現(xiàn)片斷:publicclassmBinderextendsBinder{publicMediaPlayServicegetService(){returnMediaPlayService.this;}……}在音樂(lè)播放控制的這幾種方法中,播放、暫停、停止以及進(jìn)度調(diào)節(jié),僅需調(diào)用MediaPlayer類接口就能完成操作。進(jìn)度調(diào)節(jié)代碼://播放進(jìn)度調(diào)節(jié)publicvoidseekTo(Stringurl,intprogress){try{mediaPlayer.reset();mediaPlayer.setDataSource(url);mediaPlayer.prepare();mediaPlayer.seekTo(progress);mediaPlayer.start();}catch(Exceptione){…..//相關(guān)錯(cuò)誤用語(yǔ)提示}}}MediaPlayService屬于Service,不帶UI功能。所以,同樣要實(shí)現(xiàn)Activity中的onCreate()、onStart()以及onDestroy()等諸多方法。MediaPlayer作為本地組件,在onDestroy方法中,需要釋放MediaPlayer資源。若不然,會(huì)出現(xiàn)內(nèi)存泄漏的情況。publicvoidonDestroy(){super.onDestroy();//釋放mediaPlayer資源mediaPlayer.release();}MediaPlayer組件播放音樂(lè)文件狀態(tài)圖如圖4-12所示:圖4-12MediaPlayer組件播放音樂(lè)文件狀態(tài)圖4.3.2登錄注冊(cè)模塊實(shí)現(xiàn)用戶用自己的QQ號(hào)就能夠成功地登錄。登錄時(shí),均是參照HTTPS協(xié)議。注冊(cè)信息登錄,多是為了微信登錄提供相應(yīng)的接口。構(gòu)建HTTPS前,應(yīng)當(dāng)在工作目錄中導(dǎo)入證書(打包時(shí),就已結(jié)束本步驟)。以HttpClient來(lái)對(duì)數(shù)據(jù)進(jìn)行傳遞或是接收時(shí),先以證書來(lái)生成KeyStore,并對(duì)SSLSocketFactory予以初始化,生成一個(gè)443端口的Scheme。后期,該sheme就能夠及時(shí)地發(fā)出HTTPS請(qǐng)求。登錄時(shí)序,如圖4-13。流程中,我們已經(jīng)說(shuō)明校驗(yàn)信息前HTTPS構(gòu)建的握手過(guò)程。代碼如下:setContentView(R.layout.activity_nav_deed_back);setTitle("問(wèn)題反饋");showContentView();bindingView.tvIssues.setOnClickListener(listener);bindingView.tvJianshu.setOnClickListener(listener);bindingView.tvQq.setOnClickListener(listener);bindingView.tvEmail.setOnClickListener(listener);bindingView.tvFaq.setOnClickListener(listener);4.3.3歌詞顯示模塊實(shí)現(xiàn)歌詞同步顯示,涵蓋了歌詞下載以及顯示這2個(gè)不同的部分。前者,要調(diào)用DownLoadLrc()方法;而后者,需調(diào)用MediaPlayService下屬的getCurrentDuration()方法,以掌握播放時(shí)間,并對(duì)LRC文件予以解析。代碼如下:Canvascanvas=newCanvas(bitmap);canvas.drawBitmap(src,0,0,null);canvas.scale(scaleFactor,scaleFactor,srcWidth/2,srcHeight/2);canvas.drawBitmap(logo,(srcWidth-logoWidth)/2,(srcHeight-logoHeight)/2,null);canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();(3)文件存儲(chǔ)根目錄代碼如下。StringpreFilePath=SPUtils.getString("share_code_filePath","");finalStringfilePath=getFileRoot(mContext)+File.separator+"qr_"+System.currentTimeMillis()+".jpg";圖4-13登錄過(guò)程時(shí)序圖歌詞同步顯示模塊主要方法列表如表4-5所示:表4-5歌詞同步顯示模塊主要方法列表LrcRoll方法設(shè)置了lineNum,播放時(shí)即可往上滾動(dòng)一行。如果用戶想要對(duì)進(jìn)度作出調(diào)整,則滾動(dòng)多行。歌曲剛開(kāi)始播放時(shí),下載有時(shí)尚未完成。當(dāng)下載結(jié)束并完成加載后,需滾動(dòng)多行方可匹配歌曲的進(jìn)度。在屬性設(shè)置中,用戶可以設(shè)置相應(yīng)的下載目錄以及加載方式。同步顯示,如圖4-14:圖4-14歌詞同步顯示流程圖4.3.4頻譜顯示模塊實(shí)現(xiàn)先是對(duì)捕捉波型以及回調(diào)函數(shù)進(jìn)行重寫,在Activity中進(jìn)行繪圖,展示音頻對(duì)應(yīng)的波形效果。VisualizerView類保留了View,同時(shí)也設(shè)計(jì)OnDataCaptureListener接口,適合對(duì)播放文件上的頻譜進(jìn)行捕捉。假設(shè)想捕獲波形圖,僅需重寫onWaveFormDataCapture()。該方法,也是音頻文件波形最終捕獲到的一種回調(diào)函數(shù),其波形數(shù)據(jù)大多會(huì)存儲(chǔ)于waveform數(shù)組中。publicvoidonWaveFormDataCapture(Visualizervisualizer,byte[]waveform,intsamplingRate){if(this.drawType!=DRAW_LINE){return;}this.mBytes=waveform;//設(shè)置繪圖函數(shù)中的mBytes變量postInvalidate();//刷新界面}若為繪柱狀圖,有必要對(duì)傅里葉變換完畢的回調(diào)函數(shù)onFftDataCapture(Visualizervisualizer,byte[]fft,intsamplingRate)進(jìn)行重寫,并將它們存儲(chǔ)于fftbyte數(shù)組內(nèi)。結(jié)合fft數(shù)組進(jìn)行繪圖圖,其測(cè)試效果,見(jiàn)圖4-15:圖4-15頻譜顯示的測(cè)試效果圖4.3.5搜索功能模塊實(shí)現(xiàn)在主頁(yè)提供搜索功能,點(diǎn)擊搜索按鈕,彈出鍵盤文本輸入框可查找喜歡的內(nèi)容,搜索結(jié)束后,在新頁(yè)面上會(huì)顯示出結(jié)果,在點(diǎn)擊返回按鈕關(guān)閉搜索框。搜索框在搜索時(shí)顯示,在完成時(shí)隱藏。以動(dòng)畫、科技、生活等里面的資源內(nèi)容匹配展示,單擊結(jié)果條,則轉(zhuǎn)入一個(gè)詳情頁(yè)面,用StingUtils工具類對(duì)顯示的文字格式化。@OverrideObservable<SearchResponse<SearchResult>>getSearchResult(@Query("keyword")Stringkeyword,);上述代碼中省去了一些其它的參數(shù)的設(shè)置,通過(guò)觀察者模式對(duì)關(guān)鍵字在搜索的服務(wù)的上查找,在SearchResponse是請(qǐng)求響應(yīng)成功后數(shù)據(jù)的POJO類,在實(shí)際開(kāi)發(fā)中往往會(huì)出現(xiàn)使用Gson解析后的字段與類里的之前定義屬性名不一樣的情況,使用Gson的@SerializedName注解,解決實(shí)體類對(duì)象成員變量不對(duì)應(yīng)的問(wèn)題,方便后期的維護(hù)開(kāi)發(fā)。圖4-16搜索頁(yè)面展示圖本設(shè)計(jì)中語(yǔ)音用到的JSON數(shù)據(jù)解析,用HashMap集合存儲(chǔ)解析完成的結(jié)果。在搜索的時(shí)候需要對(duì)搜索的類型進(jìn)行判斷,分為通過(guò)鍵盤輸入和語(yǔ)音輸入兩種情況,如果是鍵盤輸入則等待用戶點(diǎn)擊搜索按鈕才搜索;如果是語(yǔ)音搜索則通過(guò)Hanlder發(fā)送延時(shí)消息,并將識(shí)別出來(lái)的結(jié)果通過(guò)obtain()攜帶,延遲幾秒后列出搜索出結(jié)果列表展示,圖4-16為搜索結(jié)果頁(yè)面展示效果圖。5音樂(lè)電臺(tái)APP系統(tǒng)功能測(cè)試5.1音樂(lè)電臺(tái)推薦服務(wù)功能測(cè)試本功能測(cè)試,涵蓋了上報(bào)數(shù)據(jù)處理、計(jì)算偏好模型,對(duì)類似的歌曲基因進(jìn)行查詢。測(cè)試用例設(shè)計(jì),詳情如表5-1:表5-1音樂(lè)電臺(tái)推薦服務(wù)模塊的測(cè)試用例設(shè)計(jì)5.2音樂(lè)電臺(tái)安卓客戶端功能測(cè)試在電臺(tái)安卓客戶端,其測(cè)試內(nèi)容大致涵蓋了播放控制、聽(tīng)歌流水以及操作上報(bào)、頻譜顯示、歌曲推薦以及屬性設(shè)置這些不同的模塊測(cè)試。5.2.1歌曲播放控制模塊本模塊測(cè)試,涵蓋了歌曲播放、上下曲以及進(jìn)度調(diào)節(jié)等內(nèi)容。測(cè)試用例設(shè)計(jì)詳情如表5-2:表5-2歌曲播放控制模塊的測(cè)試用例設(shè)計(jì)5.2.2用戶操作上報(bào)模塊用戶操作上報(bào)模塊,重點(diǎn)是對(duì)用戶日常的聽(tīng)歌流水以及操作進(jìn)行上報(bào)。本模塊的測(cè)試用例,見(jiàn)表5-3:表5-3用戶操作上報(bào)模塊的測(cè)試用例設(shè)計(jì)5.2.3用戶歌曲推薦功能測(cè)試用戶歌曲推薦模塊中,涵蓋了客戶端能不能完全地對(duì)推送列表進(jìn)行解析,從服務(wù)器中拉取相關(guān)的歌曲信息。除上述外,歌曲下載同樣也要與服務(wù)器進(jìn)行對(duì)接,并結(jié)束測(cè)試。歌曲推薦模塊用例,如表5-1。5.2.4歌詞與歌曲頻譜顯示功能測(cè)試本功能模塊,其測(cè)試要點(diǎn)在于歌詞能不能和歌曲保持完全的同步
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030物聯(lián)網(wǎng)硬件開(kāi)發(fā)行業(yè)市場(chǎng)需求分析競(jìng)爭(zhēng)態(tài)勢(shì)投資評(píng)估競(jìng)爭(zhēng)格局規(guī)劃方案
- 2025-2030物聯(lián)網(wǎng)智能家居產(chǎn)業(yè)市場(chǎng)競(jìng)爭(zhēng)力分析及未來(lái)商業(yè)模式研究報(bào)告
- 2025-2030物聯(lián)網(wǎng)安全設(shè)備行業(yè)市場(chǎng)容量分析評(píng)估策
- 2025-2030物物流快遞柜行業(yè)市場(chǎng)現(xiàn)狀供需分析投資評(píng)估規(guī)劃發(fā)展研究快報(bào)資
- 2025-2030物流配送服務(wù)行業(yè)市場(chǎng)供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030物流倉(cāng)儲(chǔ)行業(yè)發(fā)展現(xiàn)狀競(jìng)爭(zhēng)格局投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030爬蘿智能音箱市場(chǎng)競(jìng)爭(zhēng)發(fā)展策略創(chuàng)新市場(chǎng)供應(yīng)競(jìng)爭(zhēng)策略需求評(píng)估
- 我國(guó)離婚經(jīng)濟(jì)補(bǔ)償制度問(wèn)題研究
- 精神衛(wèi)生服務(wù)的倫理風(fēng)險(xiǎn)防控培訓(xùn)方式
- 精益管理在設(shè)備全生命周期成本控制中的應(yīng)用
- 中國(guó)藥物性肝損傷診治指南(2024年版)解讀
- 基層黨建知識(shí)測(cè)試題及答案
- DG-TJ08-2021-2025 干混砌筑砂漿抗壓強(qiáng)度現(xiàn)場(chǎng)檢測(cè)技術(shù)標(biāo)準(zhǔn)
- 鼻竇炎的護(hù)理講課課件
- 腸系膜脂膜炎CT診斷
- 體外膜肺氧合技術(shù)ECMO培訓(xùn)課件
- 老年醫(yī)院重點(diǎn)??平ㄔO(shè)方案
- 銀行解封協(xié)議書模板
- 超星爾雅學(xué)習(xí)通《學(xué)術(shù)規(guī)范與學(xué)術(shù)倫理(華東師范大學(xué))》2025章節(jié)測(cè)試附答案
- GB 17440-2025糧食加工、儲(chǔ)運(yùn)系統(tǒng)粉塵防爆安全規(guī)范
- 《綠色農(nóng)產(chǎn)品認(rèn)證》課件
評(píng)論
0/150
提交評(píng)論