軟件工程專業(yè)畢業(yè)論文基于android音樂播放器的設(shè)計_第1頁
軟件工程專業(yè)畢業(yè)論文基于android音樂播放器的設(shè)計_第2頁
軟件工程專業(yè)畢業(yè)論文基于android音樂播放器的設(shè)計_第3頁
軟件工程專業(yè)畢業(yè)論文基于android音樂播放器的設(shè)計_第4頁
軟件工程專業(yè)畢業(yè)論文基于android音樂播放器的設(shè)計_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、(20XX 屆)本科畢業(yè)設(shè)計(論文)資料題目 名稱:基于android音樂播放器的設(shè)計學(xué)院(部):計算機與通信學(xué)院專業(yè):軟件工程學(xué)生姓名:XX班級:學(xué)號:指導(dǎo)教師姓名:XX 職稱: 系主任職稱:最終評定成績:XX大學(xué)教務(wù)處20XX 屆本科畢業(yè)設(shè)計(論文)資料第一部分畢業(yè)論文(20XX 屆)本科畢業(yè)設(shè)計(論文)題目 名稱:基于android音樂播放器的設(shè)計學(xué)院(部):計算機與通信學(xué)院專業(yè):軟件工程學(xué)生姓名:XX班級:軟件 1201 學(xué)號:12408300114指導(dǎo)教師姓名:XX職稱:系主任職稱:最終評定成績:20XX年5月XX大學(xué)本科畢業(yè)論文(設(shè)計)誠信聲明本人鄭重聲明:所呈交的畢業(yè)論文(設(shè)計)

2、,題LI基于android音樂播放器的設(shè)訃是本人在指導(dǎo)教師的指導(dǎo)下,進行研究工作所取得的成果。對本文的研究作出重要貢獻的個人和集體,均已在文章以明確方式注明。除此之 外,本論文(設(shè)計)不包含任何其他個人或集體已經(jīng)發(fā)表或撰寫過的作品成果。本人完 全意識到本聲明應(yīng)承擔(dān)的責(zé)任。作者簽名:XX日 WJ:20XX 年5月10日XX大學(xué)木科畢業(yè)設(shè)計(論文)本文說明了制作音樂播放器所用的技術(shù),制作流程和功能介紹。Android是一個開源的系統(tǒng),它底層是基于Linux的操作系統(tǒng),本論文的音樂播放器 采用了 Android開源系統(tǒng)技術(shù),利用Java語言和Eclipse編輯工具對播放器進行編寫。 同時給出了詳細的

3、系統(tǒng)設(shè)計過程、部分界面圖及主要功能運行流程圖,本文還對調(diào)試過 程中遇到的問題和解決方法進行了詳細的討論。通過制作這個軟件,我豐富了見聞,接觸了曾經(jīng)沒有涉獵的技術(shù)領(lǐng)域。同時也系統(tǒng) 地復(fù)習(xí)了 android和java語言,可以說是收獲頗豐。該播放器能流暢的播放所有MP3文件,操作流暢,使用方便。關(guān)鍵詞:界面;服務(wù);網(wǎng)絡(luò)爬蟲;數(shù)據(jù)庫;消息機制1XX大學(xué)木科畢業(yè)設(shè)計(論文)ABSTRACTThis paper illustrates the production technology used in the music player, production processes and function

4、s is introducedAndroid is an open source system, its bottom is based on the Linux operating system, this paper music player USES the Android open source system technology, using the Java language and Eclipse editing tools to write player.At the same time gives a detailed system design process, part

5、of the interface diagram and main function operation flow chart, the article also in the process of debugging problems and solving method is discussed in detail.By making this software, I am rich experiences, once contact with no dabble in technical field.Also systematically review the android and t

6、he Java language, can be said to be fniitful.The player can smooth play all MP3 files, smooth operation, easy to use.Keywords: fragment and activity; service; Jsoup; SqliteDataBase;Handler7XX大學(xué)木科畢業(yè)設(shè)計(論文)第1章引言41.1項目背景412編"5目白勺4第2章系統(tǒng)需求分析52.1功能需求52.1.1播放器基本控制需求 52.1.2網(wǎng)絡(luò)歌曲需求62.1.2歌詞顯示需求72.2界面需求82.3

7、系統(tǒng)結(jié)構(gòu)圖和流程圖102.4性能需求1125運行環(huán)境需求11第3章Android項目介紹123. 1 什么是 Android? 123.2 Android I程目錄結(jié)構(gòu) 13第4章播放器系統(tǒng)功能詳細設(shè)計154.1播放音樂與模3音樂切換時界面狀態(tài)改變4.4網(wǎng)絡(luò)歌曲下載4. 5歌詞滾動顯示7第1章引言Android開發(fā)是當(dāng)今兩大手機開發(fā)之一,另一個便是I0S系統(tǒng)。它的優(yōu)勢在于廣泛的 用戶量,開發(fā)門檻較低。而蘋果系統(tǒng)雖然運行流暢,它有垃圾處理機制,使手機運行十 兒個軟件都不卡;但相對開發(fā)較難,而且開發(fā)環(huán)境配置要求高,不便于平民開發(fā)。更主 要是Android優(yōu)點在于開放性,能

8、接受海量的應(yīng)用程序,包括一些個人自創(chuàng)程序軟件, 所以安卓的軟件會比較豐富,而這點也正是I0S特點所缺少并且堅持的,只接受承認(rèn)應(yīng) 用程序,并且非免費程序很多。1.1項目背景在廣大安卓手機用戶的前提下,java走android路線也像web路線有很好的前途, 個人立志在java領(lǐng)域能熟悉有關(guān)java的所有技術(shù),然后擇其一發(fā)展。此次畢業(yè)設(shè)計是 個基于android在線音樂播放器,主要用于綜合android技術(shù),熟練使用各種組件, 以及一個完整android項目所碰到的難題。隨著社會迅速的發(fā)展,人們有忙不完的工作,如何在忙碌中享受生活,智能手機的 普遍使得聽音樂成為了一個不錯的舒緩選擇;在這樣的背景下

9、我制做了一款集本地和在 線播放,下載和歌詞顯示以及播放模式于一體的基于android系統(tǒng)的音樂播放器。同時 也鍛煉了自己的專業(yè)技能,對大學(xué)四年也有一個圓滿的答卷。1.2編寫目的作為一個畢業(yè)設(shè)計,我覺得應(yīng)該把我們學(xué)過的專業(yè)知識總結(jié)出來,應(yīng)用在項目中, 我的android音樂播放器就是java和android這一塊最好的總結(jié),它使用eclipse adt 編寫java和android代碼及其布局文件實現(xiàn)界面與數(shù)據(jù)的交互,通過觀察者設(shè)計模式制 作手機軟件,不僅達到了鍛煉自己專業(yè)技術(shù)能力的U的,而且鞏固了大學(xué)課程的知識。 豐富了我們見聞,也為以后找工作打下堅實的基礎(chǔ)。第2章系統(tǒng)需求分析2.1功能需求2

10、.1.1播放器基本控制需求用例圖表示如下:進入圖2.1.1播放器基本控制功能用例圖用例名稱:播放;參與者:用戶;目標(biāo):播放選中列表的歌曲;詢置條件:播放器正在運行;基本事件流:點擊“播放”按鈕實現(xiàn)當(dāng)前歌曲的播放。 用例名稱:暫停;參與者:用戶;目標(biāo):暫停當(dāng)前播放的歌曲;前置條件:播放器正在運行且正在播放;基本事件流:點擊“暫?!卑粹o實現(xiàn)暫停歌曲。 用例名稱:上一首;參與者:用戶;目標(biāo):跳轉(zhuǎn)播放當(dāng)前歌曲的上一首歌曲;詢置條件:正在播放或暫停;基本事件流:點擊“上一首”按鈕實現(xiàn)上一首歌曲的播放。 用例名稱:下一首;參與者:用戶;目標(biāo):跳轉(zhuǎn)播放當(dāng)前歌曲的下一首歌曲;前置條件:正在播放或暫停;基本事件

11、流:點擊“下一首”按鈕實現(xiàn)下一首歌曲的播放。2.1.2網(wǎng)絡(luò)歌曲需求用例圖表示如下:網(wǎng)上按索圖2.1.2網(wǎng)絡(luò)請求用例圖用例名稱:歌曲下載;參與者:用戶;目標(biāo):在線類別選中的歌曲;前置條件:播放器正在運行;基本事件流:點擊“下載”按鈕實現(xiàn)對應(yīng)選中歌曲的下載。 用例名稱:在線播放;參與者:用戶;目標(biāo):播放在線列表選中的歌曲:前置條件:播放器正在運行;基本事件流:點擊“列表中的Item”播放選中的在線歌曲。 用例名稱:網(wǎng)上搜索;參與者:用戶;目標(biāo):跳轉(zhuǎn)到搜索結(jié)果顯示列表;前置條件:播放器正在運行;基本事件流:輸入搜索關(guān)鍵字點擊“搜索”按鈕返回網(wǎng)路 音樂查詢結(jié)果。XX大學(xué)木科畢業(yè)設(shè)計(論文)2.1.2歌

12、詞顯示需求 用例圖表示如下:福放進度顯不圖2.1.2歌詞顯示用例圖用例名稱:歌詞滾動顯示;參與者:播放器系統(tǒng);U標(biāo):當(dāng)前播放歌詞的滾動顯示; 前置條件:歌曲正在播放;基本事件流:點擊“播放”按鈕后選中“正在播放”的tab 頁。用例名稱:狀態(tài)量改變;參與者:播放器系統(tǒng);LI標(biāo):切換列表的歌曲在播放頁面 改變狀態(tài)欄;前置條件:播放器正在運行;基本事件流:切換歌曲時播放頁面的狀態(tài)圖標(biāo)改變。用例名稱:播放進度顯示;參與者:播放器系統(tǒng);標(biāo):實時播放進度更新; 前置條件:歌曲正在播放;基本事件流:切換到'正在播放” tab頁的歌曲進度條實時變 化。2.2界面需求一個軟件除了功能外,優(yōu)秀的UI界面影

13、響著用戶的使用體驗。是一個能改變用戶看 法,增加用戶數(shù)量的主要因素。這里就要我們熟練的使用Android的各種組件和界面控 件,尤其是布局方式:線性布局,相對布局,幀布局,絕對布局;而線性布局乂分為表 格布局,網(wǎng)格布局等;它們的正確使用既能幫助我們?nèi)蘸竺阑缑妫瑏V能使整個軟件看 起來工整無暇。我的界面做得一般,不夠華麗但也很清新,這個音樂播放器包括五大界面,收藏界 面,播放界面,列表界面,在線音樂界面,下載界面;采用統(tǒng)一的顏色格調(diào),操作流暢, 代碼結(jié)構(gòu)嚴(yán)謹(jǐn),可讀性強。操作也很簡便,是一款適用于休閑的音樂播放軟件。界面截圖如下: Q: .108:53酷我音樂播放器獨活炎亞綸獨活(電視劇G秦時明月

14、插曲)www.99L "速配歌詞配詞早習(xí)慣一個人來又去更寧愿一個人醉又醒”人生幾千萬里從未盼過能與誰同行孤身闖過衣和地妳的心蘇卷會結(jié)冰妳原來也不在乎黎明我不信命或許也是菜種寫好的宿命來讓我們或相遇或分離孤芳一世幸得一知己浮沉半生可歌不可泣若論成敗隨他留在人間笑罵里油白丫壬;才我的收藏本地列參在城砂點球安裝你不來我不老(対唱版)皿 離安團單女破秦時明月00:5304:24h麥時明月月中天幻咅寶盒使命易瑣秦時明月秦時明月案時明月正在下我:秦時明月1 :a n傘 Q: ! *"匚238|酷我音樂描放器愛你 王心凌1愛笑的眼睛 林俊杰布拉格廣場 蔡依林&周杰倫蘋操 林俊杰第

15、一次愛的人王心凌獨活 <unknown>歸去來古天樂&夕若彤h ?噺OOO1迺?C坯® GUIM沁Q2383酷我音樂描放器我的收IK本地列篆在&砂這里展示了播放界面,網(wǎng)絡(luò)界面,本地列表界面和收藏界面。其他還有長按歌曲彈出刪除分享菜單和登陸注冊,實現(xiàn)分享到微信,qq,微博的功能,以及根據(jù)儲存路徑刪除音樂文件和根據(jù)id刪除mediastore的歌曲記錄。登陸注冊是一個自定義的alertdialog彈岀框,寫入sqlitedatabase進行驗證判斷10xx大學(xué)木科畢業(yè)設(shè)計(論文)112.3系統(tǒng)結(jié)構(gòu)圖和流程圖XX大學(xué)木科畢業(yè)設(shè)計(論文)2.4性能需求性能方面我做

16、了如下優(yōu)化:1、java類的歸并,歸并冗長的重復(fù)的代碼。2、在對sqlite數(shù)據(jù)庫做了查詢優(yōu)化。3、下次進入播放器依舊保存著上次的設(shè)置和播放位置,狀態(tài)量保存完好。4、采用觀察者設(shè)計模式,優(yōu)化了代碼結(jié)構(gòu)。2.5運行環(huán)境需求開發(fā)工具:Android SDK,eclipse adt22運行環(huán)境:在windows7jdkl.6和android環(huán)境下使用eclipse編寫代碼在adv4.4和android測試真機上調(diào)試運行12XX大學(xué)木科畢業(yè)設(shè)計(論文)第3章Android項目介紹3. 1 什么是 Android?1、什么是Android?這個問題從不同的角度來說有不同的答案!在普通用戶眼中,它是一個智

17、能手機操作系統(tǒng),擁有很多功能。在android程序員眼中,它就是一個程序運行環(huán)境,許多功能都需要編寫然后再添 加到系統(tǒng)中實現(xiàn)運行。它也是一個開源的框架,任何人都可以自己給他添加代碼,改變 樣式和功能。官方介紹:Android是一種基于Linux的自由及開放源代碼的操作系統(tǒng),主要使用于 移動設(shè)備,如智能手機和平板電腦,由Google公司和開放手機聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。2、Android系統(tǒng)的四大組件(1) Activity:提供可視化用戶界面,一個android程序通常由多個Activity組成,它 有自己的生命周期,由Android系統(tǒng)控制。(2) Service:運行在后臺的一種服務(wù)程序,它很少和

18、用戶交互,因此沒有可視化界面, 定義一個Service很容易,只需繼承Service類實現(xiàn)其生命周期中的方法;它必須在清 單文件中注冊才能使用。(3) BroadcastReceiver:顧名思義廣播接收器,它和事件處理機制類似,只不過事件處理機制是程序組件級別的(例如,某個按鈕的單擊事件),而廣播事件處理 機制是系統(tǒng)級別的。到LI前為止我們可以使用Intent來啟動一個程序組件,我們還可以 通過使用sendBroadcastO方法來發(fā)起一個系統(tǒng)級別的事件廣播來傳遞消息。我們可以在 你的應(yīng)用程序中實現(xiàn)Broadcast Receiver來監(jiān)聽和響應(yīng)這些廣播的Intento(4) Content

19、Provider:用來保存和檢索數(shù)據(jù),并且使應(yīng)用程序之間相互訪問 數(shù)據(jù)成為可能。它是跨應(yīng)用程序共享數(shù)據(jù)的唯一方法。13XX大學(xué)木科畢業(yè)設(shè)計(論文)15Android系統(tǒng)有如下的兒大特性:應(yīng)用程序框架 支持組件的重用與替換Dalvik虛擬機 專門為移動設(shè)備做了優(yōu)化內(nèi)部集成瀏覽器 該瀏覽器基于開源的WebKit引擎優(yōu)化的圖形庫 包括2D和3D圖形庫,3D圖形庫基于OpenGL ESSQLite用作結(jié)構(gòu)化的數(shù)據(jù)存儲多媒體支持包括常見的音頻、視頻和靜態(tài)印象文件格式GSM電話,藍牙Bluetooth, EDGE, 3G and WiFi,照相機,GPS,指南針,和加速 度計豐富的開發(fā)環(huán)境 包括設(shè)備模擬器

20、,調(diào)試工具,內(nèi)存及性能分析圖表,和Eclipse集 成開發(fā)環(huán)境插件3. 2 Android工程目錄結(jié)構(gòu)如圖:,倡酷我音樂融器> 團占 An droid Private Libraries> 毘 Android 4.2.2> 或 JRE System Library jdkl.6.0> 禺 Referenced Libraries妙 src:> 田 Gom.music.adapterD 田 com.music.kuwop&&feD卜 A 卜 D 田 com.music.utilbsnn gen Generated Java Files assetsb

21、inlibsres0 drawable-hdpi 已 drawable-ldpi0 & drawable-mdpio 凸 drawable-xhdp!> 凸 drawable-xxhdpi> 翁 layoutD D menu凸 values0 & values-sw600dp【> D values-sw720dp-landD & values-vll0 0 values-vl4G AndroidManifest.xml9. icjauncher-web.png下面我來詳細介紹一下它的每一個U錄的作用res目錄主要是用來存放android項U的各種資源文

22、件,res就是resource單詞的縮寫。該口 錄兒乎存放了 android應(yīng)用所用的全部資源,包括:圖片資源、字符串資源、顏色資源、 尺寸資源,以及布局文件等。不同的文件存放在不同的目錄當(dāng)中,在res tl錄下面乂有 下一級目錄:1、layout |_|錄主要是存放布局文件,比如主界面布局文件mnin.xml就在這里面。我 們可以在頁面中加入各種界面顯示的控件。2、menu 錄主要是存放菜單文件,現(xiàn)在在android JF發(fā)中使用菜單不是很頻繁,比 如手機很多軟件在點擊菜單按鈕是彈出來的對話框的布局就是放在這個L1錄當(dāng)中。3、valus LI錄主要是存放一些數(shù)值,比如字符串資源存放在stri

23、ngs.xml中,color, xml 可以被定義成存儲顏色的代碼文件;style.xml主題樣式;dimens.xml存尺寸元素。4、drawable El錄都是用來存放圖片元素的,可根據(jù)圖片的大小像素決定存儲位置。 assets目錄主要存放二進制資源文件或網(wǎng)頁等等,如音樂,影視,html文件等等。src目錄主要存放java源代碼,我們一般把不同類別的java文件分開包裝,增強可讀性。gen目錄android工程自動生成的文件,如R.java文件bin目錄自動生成的二進制文件和編譯后生成的文件I ibs目錄存放引用的java第三方j(luò)ar包AndroidManifest, xml 文件Andr

24、oid 11程的配置清單文件,也是整個android應(yīng)用的全局描述文件。清單文件說 明了 android應(yīng)用的名稱、所使用的圖標(biāo)以及包含的組件等,主要包括:1、應(yīng)用程序的包名,該包名將會作為該android應(yīng)用的唯一標(biāo)識。2、應(yīng)用程序包含的組件,如 activity、server、broadcastreceier contentprovider 等, 這個就告訴我們在新建一個類繼承這些組件時,我們要在清單文件中進行注冊一下,否 則應(yīng)用程序在執(zhí)行時會報錯,無法找到相應(yīng)的類。3、應(yīng)用程序兼容的最低版本。4、應(yīng)用程序使用系統(tǒng)所要獲取的權(quán)限,比如你要向sd卡中寫入文件就要加入:XX大學(xué)木科畢業(yè)設(shè)計(論

25、文)第4章播放器系統(tǒng)功能詳細設(shè)計4.1播放音樂與模式播放音樂是主要功能,它通過四大組件之一的service來實現(xiàn)的,這樣做的好處就 是退出界面,音樂可以后臺播放,因此我們需要建立一個PlayService. java用來播放服 務(wù)的類。在服務(wù)類中我們調(diào)用系統(tǒng)的媒體播放器android, media. MediaPlayer,在播放服 務(wù)類的onCreate ()方法中實例化mediaPlayer=new MediaPlayer () o然后調(diào)用它的播放, 暫停,獲取當(dāng)前播放位置等等內(nèi)置方法并加以封裝修改更好的實現(xiàn)功能。播放模式就簡單了,只需自己設(shè)置兒個播放模式常量,在調(diào)用播放方法時判斷一下當(dāng)前

26、模式,在分別調(diào)用就行了,具體實現(xiàn)代碼中有。下面是MediaPlayer的相關(guān)方法:releaseQresetQ0iiErrorListener c-nErrorQPrepamissetDataSourceOprepare AsyiiOInitializedprepareQOiiPreparedListeiner oiiPrcparcdOPreparedstaitOprepareAMyricQWaitedseekTO/pauseOPausedStoppedstopQstartQLooping = tnic && playback completesLooping R false

27、&&onCompIcgnO invoked onackComplete(note: fihm beginning)播放模式private Random random=new Random();©Overridepublic void onCompIetion(MediaPlayer argO) switch (play_mode) case ORDER_PLAY:next();/順序播放break;case RANDOM_PLAY:play(random.nextlnt(mp31nfos.size();/ 隨機播放break;case S1NGLE_PLAY:play

28、(currentPosition);/ 單曲循環(huán)default:break;)由以上代碼可知android服務(wù)的調(diào)用流程,先綁定onbind()后調(diào)用,以下為綁定服務(wù)的流 程:Call to startServiceQThe service is stopped by itself or a clientActive LifetimeCall to bindServiceOAll clients unbind by calling unbinds 曲)Service shut downService shutdown19BoundedserviceUnboundedserviceXX大學(xué)木科畢

29、業(yè)設(shè)計(論文)還可以 startsendce()o4. 2收藏音樂收藏音樂看起來很高端,其實無非是把點擊收藏的音樂寫入sqlite數(shù)據(jù)庫,當(dāng) 我們點擊收藏的“心形”圖標(biāo)時,會執(zhí)行對新建的lovemusic.db的插入數(shù)據(jù)操作,跳轉(zhuǎn) 收藏頁面在調(diào)用查詢所有收藏歌曲的操作,判斷“心形”圖標(biāo)的背景顏色是否為已收藏 的顯示的顏色,然后再次點擊會執(zhí)行刪除當(dāng)前歌曲的收藏操作。 pqliteDdtaBase 代表一個數(shù)據(jù)庫對象,它的一些方法展示如下:方法名稱方法描述openOiCreMeDatabase<Stnng path, SQLiteEtotabftse.CursoiFactoiy ftctoi

30、y)打開或者刨建數(shù)據(jù)庠irert(String table, Strmg nuDColumnHack, ContentValues values)添加一條記錄defete(Stnng table, Stnng whereClause, StnugO whereArgg)鵬一條曲qwry(Strmg Ubb, StrmgO coluirir«s, Stnngselection, StringO selectionA巒.String groupB% String having String orderBy)查誼記錄updatestnug tabte, ContentValues valu

31、es, Stnng whereClause, StnngQ whereArgs)修改記錄execSQL(Stnng sql)執(zhí)行一條SQL語句cbse()關(guān)閉數(shù)據(jù)庫public class DBhelper extends SQLiteOpenHelperjpublic DBhelper(Context context, String name, CursorFactory factory, int version) super(context, ,lovemusic.db, null, 5);©Overridepublic void onCreate(SQLiteDatabase

32、db) db.execSQL("create table mymusic(id integer primary key autoincrement/+Htitle varchar(20)/,+,mp3infoID varchar(20)H);)PlayActivity.java 部分代碼case R.id.love_music: if(query(playService.getCurrentPosition() delete(playSenice.getCurrentPosition(); inig_love.setImageResource(R.drawable. Toast.&q

33、uot;取消噥藏",1 ).show();else add(playService.getCurrentPosition(), mp3Infos.get(playService.getCurrentPosition().getTitIe(); img_love.setImageResource(R.drawable. Toast.皿辰7ki/(this,"添加收藏*l).show();private void add(int mp3id,String mp3 name) SQLiteDatabase db=he!per.getWritableDatabase();Conte

34、ntValues values=new ContentValues();values.put(Hmp3infoID", mp3id+nH);values.put(ntitle' mp3name); db.insert(',mymusic, null, values);private void delete(int mp3id) XX大學(xué)木科畢業(yè)設(shè)計(論文)SQLiteDatabase db=helper.getWritableDatabase(); db.delete(Hmymusic, Mmp3infoID=?M, new String mp3id+HH); db.

35、close();1private boolean query(int mp3id) SQLiteDatabase db=helper.getWritableDatabase();Cursor cursor=db.rawQuery(Hselect * from mymusic where mp3infoID=?H, new String mp3id+,H,);boolean result=cursor.moveToNext();cursor.close();db.close();return result;14. 3音樂切換時界面狀態(tài)改變狀態(tài)改變需要調(diào)用PlayService的更新狀態(tài)接口 in

36、terface MusicUpdateListener中的 onChange()方法,這個接口在基類BaseActivity中實現(xiàn),而PlayActivity繼承了這個基類, 實際上所有的界面Activity都繼承了這個基類用于綁定服務(wù)等,所以在PlayActivity實現(xiàn) 了 onChangc()方法。在onChange()把所有狀態(tài)屬性的量根據(jù)當(dāng)前播放的position進行更改,實現(xiàn)了對service的監(jiān)聽。public void change(int position) 7狀態(tài)性變量改變Mp3Info mp3Info=mp3Infos.get(position);setLrcView()

37、;title.setText(mp3Info.getTit!e(); end_time.setText(MediaUtils7i?77n«/7zme(mp3Info.getDuration(); if(query(playService.getCurrentPosition()img_love.setImageResource(R.drawable.ep);(else img_love.setImageResource(R.drawable.no/:e7?);)Bitmap bm=MediaUtils.et4rfMrZ:(this9mp3Info.getId(), mp3Info.g

38、etAlbumId(), true, false);img_lyric.setImageBitniap(bm);seekBa r.setProgress(O);seekBar.setMax(int) mp3Info.getDuration();lf(playService.isplaying() img_play.setImageResource(R.drawable./?6/M5(?);else img_play.setImageResource(R.drawable./?/H);switch (playService.getPlay_mode() case PlayService. ORD

39、ERPLA Y:nienu.setlniageResourceCR.drawable.we/zw);menu. setTag(PIayS ervice ORDER_PLA Y);break;case PlayService.RANDOM_PLAY: nienu.setImageResource(R.drawable.5/7z/7); nienu.setTag(PIayService./?/lAr£)(?M_PMK); break;case PlayService.S/NG厶menu.setImageResource(R.drawable.nienu.setTagPlayService

40、./AG LE_PLAY);default:break;)4.4網(wǎng)絡(luò)歌曲下載本次軟件設(shè)計采用的是口度上的音樂,其實一般情況是自己在做播放器的基礎(chǔ)之上 再做一個音樂后臺,用來作為網(wǎng)絡(luò)請求。而我覺得自己做個后臺然后發(fā)出請求,這樣有 弊端,如音樂不全面等,我這里是利用網(wǎng)絡(luò)爬蟲Jsoup對白度音肩 進行網(wǎng)頁內(nèi)容抓取,然后通過得到歌曲ID,歌名,歌手和專輯實現(xiàn)listview的顯示布局 及其通過歌曲ID和歌曲URL下載音樂。使用Handler機制實現(xiàn)方法的跳轉(zhuǎn)調(diào)用具體實現(xiàn)代碼如下: mp3url=n ult.getMusicId()+n.mp3M;下載歌曲protected void down!oadM

41、usic(final SearchResult searchResult.final String url,final Handler handler) mThreadPool.execute(new Runnable() ©Overridepublic void run() File niusicDirFile=new Fie(Environment.getExtenialStorageDirectory()+Contant.DIR_MUSIC) if(!musicDirFile.exists()musicDirFile.mkdirs();)String mp3url=url;Sy

42、stem.6?M/.println(ninp3url:H+mp3url);String target=musicDirFile+7n+searchResult.getMusicname()+H.mp3H;File filetarget=new File(target);if(filetarget.exists() handler.obtainMessage(M/S/C_£X/Sry).sendToTarget();return;Jelse tnr URL url=new URL(mp3url);HttpURLConnection connection=(HttpURLConnecti

43、on)url.openConnection();InputStream inputStream=connection.getInputStream();FileOutputStream fileOutputStream=new FileOutputStream(filetarget); byte b=nevv byte1024;intj=O;while(j=inputStream.read(b) !=-1) fileOutputStreani.write(b. 0, j);fileOutputStream.flush();fileOutputStream.close();handler.obt

44、ainMessage(SC/CCE55_MP34arget).sendToTarget(); catch (Exception e) e.printStackTrace(); handIer.obtainMessage(St/CCESS_MP3).sendToTarget();)1);既然說到了網(wǎng)頁爬蟲jsoup.我還使用了它調(diào)用白度音樂的搜索引擎來獲取百度音 樂的熱歌榜和按輸入的關(guān)鍵字進行搜索;SearchUtil的主要部分代碼:/Jsoup請求網(wǎng)絡(luò)數(shù)據(jù)private ArrayList<SearchResult> getMusicList(final String key.fi

45、nal int page)final String start=String.vt/nO/(page-1 )*5/ZE);Document doc=Jsoup.cf?nnc(t/?L).data(,key'key/'start,start/,size,String.v«/weCy(S7ZE) .userAgent(Contant.i7SE/?_AGE,7Vr).timeout(60* 1 OOO).get();Elements songTitles=doc.select(ndiv.song-item.clearfixM);Elements songinfos;Arra

46、yList<SearchResult>searchResults=nevv ArrayList<SearchResult>();TAG:for(EIement song:songTitles) songInfos=song.getElementsByTag(HaM); SearchResult searchResult=new SearchResult(); for(Element info:songlnfos)歌曲鏈接if(info.attr(MhrefH).startsWith(,7songM) searchResult.setMusicname(info.text

47、(); searchResult.setUrl(info.attr(nhref');searchResult.setMusicId(info.attr(nhref,').substring(info.attr("href,).lastIndexOf(,7,)+l); System.oz/r.println(info.attr(,href,).substring(info.attr(,hrefn).lastIndexOf(,7H)+l);1 歌手鏈接 if(info.attr(HhrefH).startsWith(,7dataH) searchResult.setArt

48、ist(info.text();1專輯鏈接if(info.attr(Hhref.startsWith(ValbumM) searchResult.setAlbum(info.text().replaceAll("<l>n,M,);) searchResults.add(searchResult);return searchResults;4. 5歌詞滾動顯示歌詞滾動顯示主要原理就是一個滾動的TextView控件,先通過路徑和歌名讀取歌詞 文件,寫入流,然后解析歌詞格式,把歌詞前的時間作為播放某一句的時間,然后把當(dāng) 前的播放的那行設(shè)為高亮等等,部分代碼如下:LyricVie

49、w.java/繪圖歌詞onDraw(Canvas canvas) super.onDraw(canvas);currentPaint.setColor(Color. YELLOW);notCurrentPaint.setColor(Color.VW/rE);currentPaint.setTextSize(TEXT_SIZE); / 設(shè)置字體大小 currentPaint.setTypeface(Typeface.SE/?/F);設(shè)置字體樣式notCurrentPaint.setTextSize(textSize);notCurrentPaint.setTypeface(Typeface.&#

50、163;)EMt/L7;setText(HH); canvas.drawText(mLrcList.get(index).getLrcStr(), width / 2, height / 2, currentPaint);float tempY = height / 2;/畫出本句之前句for (int i = index - 1; i >= 0; i) 向上推移tempY = tempY textHeight; canvas.drawlext(mLrcList.get(i).getLrcStr(), width / 2, tempY, notCurrentPaint);tempY =

51、heicht / 2;/畫出本句之后的句子for (int i = index + 1; i < mLrcList.size(); i+) /往下推移tempY = tempY + textHeight; canvas.drawText(mLrcList.get(i).getLrcStr(), width / 2, tempY notCurrentPaint);)處理歌詞的方法:parseLrc(InputStream inputStream) /解析歌詞時間timeStr(String timeStr)LyricContent.java(用來存放歌詞的實體類)歌詞部分我借鑒了網(wǎng)上的一些

52、資料,其實在github網(wǎng)上有這樣歌詞的dem。,我下載 下來仿照制作了自己的歌詞顯示,曲于我使用eclipse adt開發(fā)工具無法像android studio 那樣直接引入三方插件為自己所用,只能自己看資料理解它的類的使用。21XX大學(xué)木科畢業(yè)設(shè)計(論文)通過本次畢業(yè)設(shè)計,讓我對java基礎(chǔ)知識進行了鞏固和提升,對android體系有了 更加深刻的認(rèn)識,對程序設(shè)訃模式和面向?qū)ο缶幊趟枷肓私獾酶油笍亍O旅鎭碚f說我 制作這個應(yīng)用的歷程和心得吧! 歷程:(1) 的確,做這個東西花費了我一個寒假的時間,起初只是實現(xiàn)了基本的播放和下 一首的功能,這些書上就有介紹,界面沒有美化,光禿禿的兒個按鈕,歌

53、曲的路徑還得 自己寫,慢慢的我找到了 medidplayer這個自帶的android媒體庫,可以通過它得到url, 這讓我乂方便了許多,起碼沒必要自己輸入歌曲路徑了。啟動Service 個Service有 兩種方法:一種是 startService (Intent) : 55外一種是:bindService (Intent); 第一種啟動方式,適用于Service獨立完成任務(wù),例如說一個下載,如果不需要暫?;?者取消的話,可以這樣來做。但是,我們這是音樂播放應(yīng)用,把MediaPlayer放在Service 中執(zhí)行播放,這樣的方式很難有暫停等交互。(其實也可以這樣做,例如每次交互操作 都用sta

54、rtService來做,通過Intent把暫停等命令出入進去,進度條也可以通過廣播 來發(fā)送出去,但是這樣做,感覺很丑陰,肯定不是常規(guī)的高效做法);第二種啟動方式, 可以在onServiceConnected中,獲得一個Service對象(可能不是一個Service對象, 至少是一個可以接觸Service內(nèi)部操作的句柄)。這樣,便可以輕松操作播放和接收進 度通知。但是這種方式有弊端,一旦與之綁定的context退出,則綁定接觸,Service 也會被回收(但是不會執(zhí)行onDestory方法);那么是不是就只是簡單用第二種啟動方 式?當(dāng)然不是這樣,這兩種方式并不沖突,而且十分適用于音樂播放類的應(yīng)用

55、。(2) 接著,我使用了 listview實現(xiàn)了歌曲列表,這個比較簡單,以前學(xué)過也使用過; 然而在tab布局時發(fā)生了奇怪的事情,TubActivity不能像往常一樣調(diào)用PlayService服務(wù), 我找了很多地方,由于我開始并不知道是TabActivity的問題以為是PlayService在綁定服 務(wù)時ServiceConnection連不上,后來才一步步排除這些可能,應(yīng)該是TabActivity的問題, 在一個微博上看到一個人的解說,它與普通的Activity有所不同: bindservice=this.getApplicationContext().bincIService(intent,ServiceConnection,Context.BIND _AUTO_CREATE);Log.i("bind","服務(wù)綁定,z) ;/TabActivity 的問題,bindservice 要加 getapplicationcontexto這個問題讓我糾結(jié)了好兒天,我問的好友都說真是個奇葩的問題, 算是學(xué)習(xí)了。(3) 接下來做的是收藏音樂的功能,主要是sqlite這塊,基本無錯,增刪查都行, 另外就

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論