版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 畢業(yè)設(shè)計(jì)(論文)</b></p><p> 標(biāo) 題: 基于Android的音樂播放器 </p><p> 學(xué)生姓名: </p><p> 系 部: 電子信息系 </p><p> 專
2、業(yè): 軟件技術(shù) </p><p> 班 級(jí): </p><p> 指導(dǎo)教師: </p><p><b> 摘 要</b></p><p> 當(dāng)今社會(huì)的生活節(jié)奏
3、越來越快+Android系統(tǒng)上一的款音樂播放器應(yīng)用程序的設(shè)計(jì)與實(shí)現(xiàn)進(jìn)行討論。Android是一個(gè)開源的系統(tǒng),它底層是基于Linux的操作系統(tǒng),本論文的音樂播放器采用了Android開源系統(tǒng)技術(shù),利用Java語言和Eclipse編輯工具對(duì)播放器進(jìn)行編寫。同時(shí)給出了詳細(xì)的系統(tǒng)設(shè)計(jì)過程、部分界面圖及主要功能運(yùn)行流程圖,本文還對(duì)高度過程中遇到的問題和解決方法進(jìn)行了詳細(xì)的討論,該音樂播放器集播放、暫停、停止、上一首、下一首、音量調(diào)節(jié)、歌詞顯示等功
4、能于一體,性能良好,在Android系統(tǒng)中能獨(dú)立運(yùn)行。該播放器還擁有對(duì)手機(jī)文件瀏覽器的訪問功能、歌曲播放模式、以及歌詞開閉狀態(tài)的友好設(shè)置.MP3的全名是MPEG Audio Layer-3,是一種聲音文件的壓縮格式,由于本播放器只限于應(yīng)用層程序的探討,所以對(duì)具體的壓縮算法不作深究。</p><p> 關(guān)鍵詞:Android ; 開源系統(tǒng) ; Eclipse ; 音樂播放器</p><p>
5、;<b> 1系統(tǒng)需求分析</b></p><p><b> 1.1功能需求</b></p><p> 1.1.1播放器的基本控制需求</p><p> 根據(jù)項(xiàng)目的目標(biāo),我們可獲得項(xiàng)目系統(tǒng)的基本需求,一下從不同的角度來描述系統(tǒng)的需求,并且使用用例圖來描述,系統(tǒng)的功能需求,我們分成四部分來概括,即播放器的基本控制需要
6、,播放列表管理需求,播放器友好性需求和播放器擴(kuò)展卡需求。</p><p> 圖1.1 播放器基本控制圖</p><p> 在播放器正在運(yùn)行時(shí),用戶單擊“播放”按鈕,播放器將播放選中的播放列表中的音樂,并同時(shí)顯示當(dāng)前進(jìn)度;當(dāng)歌曲未暫?;蛲V箷r(shí),用戶單擊“暫停”按鈕,播放器將進(jìn)入暫停狀態(tài);播放器正在播放或暫停時(shí),用戶單擊“停止”按鈕,播放器將停止播放或暫停時(shí),用戶點(diǎn)擊“上一首”或者“下一首
7、”按鈕,播放器將播放上一首或下一首歌曲。</p><p> 1.1.2功能需求(時(shí)序圖)分析</p><p> 從時(shí)序圖中可以看出播放器中信息發(fā)送和調(diào)用過程</p><p> 圖1.2 音樂播放器的時(shí)序圖</p><p> 1.2 系統(tǒng)結(jié)構(gòu)圖和流程圖</p><p> 圖1.3 音樂播放器系統(tǒng)流程圖</
8、p><p><b> 1.3系統(tǒng)界面需求</b></p><p> 播放器界面要求布局合理,簡(jiǎn)約,顏色舒適,控制按鈕友好,能讓用戶一眼就能看出各個(gè)按鈕的作用及操作方法。能實(shí)現(xiàn)要求的功能,但又不重復(fù)。要考慮到不同手機(jī)屏幕大小可能不一樣,應(yīng)盡量兼容大多數(shù)手機(jī)屏幕尺寸,使之顯示無障礙。</p><p><b> 1.4系統(tǒng)性能需求<
9、/b></p><p> 根據(jù)Android手機(jī)系統(tǒng)要求無響應(yīng)時(shí)間為5秒,所以就有如下性能要求:</p><p> 當(dāng)要求歌曲播放時(shí),程序響應(yīng)時(shí)間最長(zhǎng)不能超過5秒</p><p> 當(dāng)要求歌曲暫停時(shí),程序響應(yīng)時(shí)間最長(zhǎng)不能超過5秒</p><p> 當(dāng)要求歌曲停止時(shí),程序響應(yīng)時(shí)間最長(zhǎng)不能超過5秒</p><p&
10、gt; 當(dāng)要求歌曲上/下一首時(shí),程序響應(yīng)時(shí)間最長(zhǎng)不能超過5秒</p><p> 界面切換響應(yīng)時(shí)間最長(zhǎng)不能超過3秒</p><p><b> 1.5運(yùn)行環(huán)境需求</b></p><p> 操作系統(tǒng):Windows xp</p><p> 支持環(huán)境:Android 2.1版本</p><p>
11、; 開發(fā)環(huán)境:Eclipse 3.5 ADT 0.95</p><p> 2 Android項(xiàng)目介紹</p><p> 2.1什么是Android</p><p> 2.1.1Android的介紹</p><p> Android一詞的本義指“機(jī)器人”,同時(shí)也是Google于2007年11月5日宣布的基于Linux平臺(tái)的開源手機(jī)操作
12、系統(tǒng)的名稱,該平臺(tái)由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成,號(hào)稱是首個(gè)為移動(dòng)終端打造的真正開放和完整的移動(dòng)軟件。</p><p> Android是基于Linux內(nèi)核的軟件平臺(tái)和操作系統(tǒng),早期由Google開發(fā)(在華注冊(cè)商標(biāo)名為“安致”),后由開放手機(jī)聯(lián)盟(Open Handset Alliance)開發(fā)。它采用了軟件堆層(software stack,又名以軟件疊層)的架構(gòu),主要分為三部分。低層以Linux
13、內(nèi)核工作為基礎(chǔ),只提供基本功能;其他的應(yīng)用軟件則由各公司自行開發(fā),以Java作為編寫程序的一部分。另外,為了推廣此技術(shù),Google和其他幾十個(gè)手機(jī)公司建立開發(fā)手機(jī)聯(lián)盟。Android在未公開之前常被傳聞為Google電話或gPhone。大多傳聞?wù)J為Google開發(fā)的是自己的手機(jī)電話產(chǎn)品,而不是一套軟件平臺(tái)。到了2010年1月,Google開始發(fā)表自家品牌手機(jī)電話的Nexus One。</p><p> 2.1
14、.2 Android Features 特性:</p><p> Android 系統(tǒng)有如下的幾大特性</p><p> 應(yīng)用程序框架 支持組建的重用與替換</p><p> Dalvik 虛擬機(jī) 專門為移動(dòng)設(shè)備做了優(yōu)化</p><p> 內(nèi)部集成瀏覽器 該瀏覽器基于開源的WebKit引擎</p><p>
15、優(yōu)化的圖形庫(kù) 包括2D和3D圖形庫(kù),3D圖形庫(kù)基于OpenGl ES</p><p> SQLite 用作結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)</p><p> 多媒體支持 包括常見的音頻、視頻和靜態(tài)印象文件格式(如MPEG4,H.264,MP3,AAC,AMR,JPG,PNG,GIF)</p><p> GSM電話 (依賴于硬件)</p><p> 藍(lán)
16、牙Bluetooth,EDGE,3G,安定WIFI(依賴于硬件)</p><p> 照相機(jī),GPS,指南針,和加速度計(jì)(依賴于硬件)</p><p> 豐富的開發(fā)環(huán)境 包括設(shè)備模擬器,調(diào)試工具,內(nèi)存及性能分析圖表,和Eclipse集成開發(fā)環(huán)境插件</p><p> 2.1.3 Android 基本框架(Android Architecture)</p&g
17、t;<p> 圖2. 1Android Architecture(android 軟件結(jié)構(gòu)圖)</p><p> 其軟件層次結(jié)構(gòu)自上而下分為以下幾個(gè)層次</p><p> 應(yīng)用程序(Application)</p><p> 應(yīng)用程序框架(Application Framework)</p><p> 各種庫(kù)(Libr
18、aries)和Android運(yùn)行環(huán)境(RunTime)</p><p><b> 操作系統(tǒng)層</b></p><p> Application</p><p> Application Android 會(huì)同一核心應(yīng)用程序包一起發(fā)布,該應(yīng)用程序包包括email客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯(lián)系人管理程序等。所有的應(yīng)用程序都是
19、用JAVA編寫的。</p><p> Application FrameWork</p><p> 開發(fā)者完全可以訪問核心應(yīng)用程序所使用的API框架。該應(yīng)用程序架構(gòu)用來簡(jiǎn)化組件軟件的重用;任何一個(gè)應(yīng)用程序都可以發(fā)布它的功能塊并且任何其他的應(yīng)用程序都可以使用其所發(fā)布的功能塊(不過的遵循框架的安全性限制)。該應(yīng)用程序重用機(jī)制使得組件可以被用戶替換。</p><p>
20、 所有的應(yīng)用程序都由一系列的服務(wù)和系統(tǒng)組成,包括:</p><p> 可擴(kuò)展的視圖(Views)可以用來建應(yīng)用程序,包括列表(lists),網(wǎng)格(Grids),文本框(Text boxes),按鈕(button),甚至包括另一個(gè)可嵌入的web瀏覽器。</p><p> 內(nèi)容管理器(Content Providers)使得應(yīng)用程序可以訪問另一個(gè)應(yīng)用程序的數(shù)據(jù)(如聯(lián)系人的數(shù)據(jù)庫(kù)),或者共
21、享它們自己的數(shù)據(jù)。</p><p> 資源管理器(Resource Manager)提供非代碼資源的訪問,如本地字符串,圖形,和分層文件(Layout Files)。</p><p> 通知管理器(Notification Manager)使得應(yīng)用程序生可以在狀態(tài)欄中顯示客戶通知信息。</p><p> 活動(dòng)類管理器(Activity Manager)用來管理
22、應(yīng)用程序生命周期并提供常用的導(dǎo)航回退功能。</p><p> Libraries庫(kù)</p><p> Android包括一個(gè)被Android系統(tǒng)中各種不同組件所使用的C/C++庫(kù)集。該庫(kù)通過Android應(yīng)用程序框架為開發(fā)者提供服務(wù)。</p><p> Android Runtime</p><p> Android包括了一個(gè)核心庫(kù),
23、該核心庫(kù)提供了JAVA編程語言核心庫(kù)的大多數(shù)功能。 每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例。Dalvik是針對(duì)于同時(shí)高效地運(yùn)行多個(gè)VMS來實(shí)現(xiàn)的。Dalvik虛擬機(jī)執(zhí)行.dex的Dalvik可執(zhí)行文件,該格式文件針對(duì)最小內(nèi)存使用做了優(yōu)化。該虛擬機(jī)是基于寄存器的,所有的類都經(jīng)由JAVA匯編器編譯,然后通過SDK中的dx工具轉(zhuǎn)化成.dex格式由虛擬機(jī)執(zhí)行。 Dalvik虛擬機(jī)依賴于
24、linux的一些功能,比如線程機(jī)制和底層內(nèi)存管理機(jī)制。</p><p><b> Linux內(nèi)核</b></p><p> Android的核心系統(tǒng)服務(wù)依賴于Linux2.6內(nèi)核,如安全性,內(nèi)存管理,進(jìn)程管理,網(wǎng)絡(luò)協(xié)議和驅(qū)動(dòng)模型。Linux內(nèi)核也同時(shí)作為硬件和軟件堆棧之間的硬件抽象層。</p><p> 2.2 Android應(yīng)用軟件開發(fā)
25、的核心技術(shù)</p><p> 2.2.1 Android 應(yīng)用開發(fā)語言</p><p> JAVA是Android上的主流開發(fā)語言,各種支持也最完善。Android發(fā)布的API和SDK也都主要是面向JAVA開發(fā)人員的。我的播放器實(shí)例也是用JAVA開發(fā)的。</p><p> 2.2.2 Android 應(yīng)用程序組件</p><p> A
26、ndroid 應(yīng)用程序最大的一個(gè)特點(diǎn)就是每個(gè)應(yīng)用都由若干組件構(gòu)成。而且各個(gè)應(yīng)用程序的組件還可以相互調(diào)用(需要在代碼中設(shè)置相應(yīng)權(quán)限)。例如假設(shè)我們需要編寫一個(gè)內(nèi)嵌于網(wǎng)頁的程序,那么我們無需親自編寫瀏覽器,而是可以直接調(diào)用系統(tǒng)自帶的Chrome Lite瀏覽器組件。又如假設(shè)我們編寫了兩個(gè)應(yīng)用程序,其中一個(gè)程序中有列表顯示圖標(biāo)的組件,那么我們?cè)诹硪粋€(gè)應(yīng)用程序中就可以使用該組件,而不需要在編寫該功能。也就是說,不同于我們平常編寫的程序,Andr
27、oid的應(yīng)用程序不是單一入口,而是可以從代碼的不同位置啟動(dòng)。這就要依靠組件來實(shí)現(xiàn)。</p><p> Android應(yīng)用程序的組件有以下四種:</p><p><b> Activity</b></p><p> 一個(gè)Activity實(shí)際上表現(xiàn)出來的就是一個(gè)程序的界面。這個(gè)界面可能有許多不同的形式,比如有列表形式,有文字形式,有圖像格子等
28、形式。一個(gè)應(yīng)用程序也可能有不止一個(gè)Activity。比如一耳光短消息的程序,需要有列表顯示所有消息的Activity,還至少需要一個(gè)編輯短信的Activity,還可能需要設(shè)置、菜單等界面。</p><p> 每個(gè)Activity都有一個(gè)默認(rèn)的窗口用于繪制界面,一般情況下,它是充滿全屏的,但是我們可以通過程序控制它,使其小于屏幕大小,也可以控制其浮動(dòng)于其他窗口之上(如Android中的Toast信息)。</
29、p><p> Activity中顯示出來的內(nèi)容其實(shí)是由view堆疊形成的,view是由View基類派生出來的各種形式的界面元素,如ListView,GridView等等,通過組合這些view,就形成了一個(gè)可見的Activity。我們可以用Activity.setContentView()方法來設(shè)置一個(gè)Activity中所要顯示的view。</p><p><b> Service
30、</b></p><p> Service是一種沒有界面的組件,同我們平常在Windows或Linux系統(tǒng)中所理解的“服務(wù)”一樣,Android上的service也是運(yùn)行在后臺(tái)的,運(yùn)行時(shí)間可以從系統(tǒng)啟動(dòng)到系統(tǒng)關(guān)閉為止。對(duì)于許多應(yīng)用程序來說,service組件式至關(guān)重要的。以下載管理器為例,用戶肯定希望能夠在切換到其他程序時(shí)仍然在后臺(tái)繼續(xù)下載,這就需要用到service完成下載工作。而顯示下載進(jìn)度、已
31、下載文件等信息則由Activity完成,同時(shí)我們還希望控制下載過程,如停止、繼續(xù)等,這就需要Activity與service之間進(jìn)行通信。Android允許activity連接到或者綁定到service上,這樣就可以讓用戶在界面上控制后臺(tái)service的行為。</p><p> Broadcast receiver</p><p> Broadcast意為廣播消息,Android系統(tǒng)自
32、身會(huì)發(fā)出許多廣播消息,如電量不足,用戶修改了全局設(shè)置等,各個(gè)應(yīng)用程序也以向整個(gè)系統(tǒng)廣播消息,如文件下載。</p><p> Broadcast receiver則是程序中專門用來接收廣播消息的組件,它沒有界面顯示,只負(fù)責(zé)監(jiān)聽、接收廣播消息,然后根據(jù)程序邏輯,啟動(dòng)其他組件去處理廣播消息。它可以啟動(dòng)一個(gè)Activity來同用戶交互,也可以使用NotificationManager向用戶發(fā)出通知。Nitificati
33、onManager的 通知形式有許多種,不如說振動(dòng)、響鈴、閃LED燈,還可以在Android界面的消息欄處顯示信息。</p><p> Content providers</p><p> Content provider是一種為其它應(yīng)用程序提供數(shù)據(jù)的組件。這些數(shù)據(jù)可以保存在文件中,也可以保存在SQLite數(shù)據(jù)庫(kù)中,還可以以其他任何有效的方式保存。ContentProvider類為我們
34、提供了一系列保存數(shù)據(jù)的方法供我們調(diào)用,可以很方便地存儲(chǔ)數(shù)據(jù)。其它應(yīng)用程序在需要使用這些數(shù)據(jù)時(shí),可以用ContentResolver對(duì)象,使用其中的方法。ContentResolver可以與任何contentprovider交互,獲取其中的數(shù)據(jù)。</p><p> 只需要某個(gè)組件,Android就會(huì)盡力保證它的可用;如果該組件還沒有啟動(dòng),就啟動(dòng)它,如果該組件所屬的應(yīng)用程序還沒擁有一個(gè)進(jìn)程,則為它啟動(dòng)一個(gè)進(jìn)程,如果
35、系統(tǒng)資源不足以容納一個(gè)新的進(jìn)程,則將后臺(tái)的某個(gè)進(jìn)程殺死為新進(jìn)程騰出資源。</p><p> 2.3 Android開發(fā)環(huán)境的搭配</p><p> 任何事物要運(yùn)行,都要有它的環(huán)境,Android也有它的環(huán)境才能夠運(yùn)行,下面介紹Android的開發(fā)環(huán)境配置.</p><p> 搭建開發(fā)環(huán)境需要的軟件:</p><p> 操作系統(tǒng):Win
36、dows XP或Linux</p><p> 軟件包:Android SDK(Software Development kit Java Development kit) 、ADT(Android Develoopment Tool)</p><p> IDE環(huán)境:Eclipse IDE+ADT Eclipse3.3以上</p><p> JDK:Java R
37、untime Environment虛擬機(jī) 、(JDK)Java Development kit</p><p><b> 安裝步驟如下:</b></p><p> 第一步:安裝Java虛擬機(jī)sun-java6-jdk版本</p><p> 第二步:安裝Eclipse3.5工具 官網(wǎng)http://www.eclipse.org/downl
38、oads/</p><p> 選擇版本(圖4.2):進(jìn)行安裝</p><p><b> 圖 2.2 </b></p><p> 第三步:安裝Android SDK:首先要下載SDK,可以在這個(gè)網(wǎng)址下載Http://developer.android.com/sdk ,選擇相應(yīng)的系統(tǒng)進(jìn)行安裝</p><p><
39、;b> 圖 2.3 </b></p><p> 第四步:安裝Android ADT插件</p><p> 運(yùn)行Eclipse,選擇help->install new software 選擇add,將會(huì)彈出一個(gè)框</p><p><b> 圖 2.4 </b></p><p> 點(diǎn)擊O
40、K,選擇要安裝的軟件,占next,然后選擇接受協(xié)議,直到安裝成功,重啟Eclipse軟件,設(shè)置Android SDK Home,Window->refrence</p><p><b> 圖 2.5 </b></p><p> 在SDK location中輸入SDK Tools路徑:D:\android software\android-sdk-windo
41、ws 點(diǎn)擊OK</p><p> 這樣Android環(huán)境就已經(jīng)搭建成功了。</p><p> 2.4 Android模擬器中sd卡的創(chuàng)建和文件的上傳</p><p> 在Android模擬器中,初始時(shí)沒有sdcard的,為了存放音樂文件,需要自己創(chuàng)建sdcard,我們先來看看如何創(chuàng)建sdcard以及文件上傳。</p><p> 2.4
42、.1 SD卡的創(chuàng)建</p><p> 通過Android的Tools來創(chuàng)建sd卡并導(dǎo)入進(jìn)來</p><p> 打開dos,windows+R鍵打開。轉(zhuǎn)換到你的sdk安裝包的tools目錄下,如我的目錄如下:E:\android-sdk-windows\tools </p><p> 創(chuàng)建sd卡。在命令行中輸入:mksdcard 1024M E:\androi
43、dsdcard\sdcard.img</p><p> (這個(gè)1024M就是我們要?jiǎng)?chuàng)建的SD卡的大小,還是根據(jù)自己的需要來輸入,最后面的那個(gè)E:\androidsdcard\sdcard.img就是所設(shè)置的SD存放路徑,這里也可以根據(jù)我們自己的需要改變路徑的,但要注意路徑中不能有空格出現(xiàn))</p><p> 在Eclipse里面創(chuàng)建模擬器,并以該SD開來創(chuàng)建</p>&l
44、t;p> 創(chuàng)建完成之后,啟動(dòng)該模擬器。可以在Android SDK and AVD Manager 里面指定模擬器并啟動(dòng)。</p><p> 同樣打開Eclipse的DDMS-File—Explorer 查看sd卡是否安裝成功。</p><p> 2.4.2向sd卡里面上傳文件及異常解決</p><p> 右邊兩個(gè)小手機(jī)按鈕就是傳輸文件的按鈕了,用它
45、來實(shí)現(xiàn)文件的傳入和傳出了,向左的表示把手機(jī)里的文件導(dǎo)出,向右的表示把文件導(dǎo)入到手機(jī)里面去。這里和容易出現(xiàn)異常。異常如下:</p><p> 異常一:Failed to push selection:Invalid argument</p><p> 出現(xiàn)此異常,多半是文件所在的目錄里面有中文或者文件的名字是中文導(dǎo)致的。</p><p> 建議修改一下試試。還有
46、就是觀察自己的操作權(quán)限是不是不夠,如果是,d—rwxr—x 那就是可以的。如果,sd卡是在eclipse里面系統(tǒng)自動(dòng)創(chuàng)建的,試著重啟一下IDE。</p><p> 異常二:Failed to push the item(s)</p><p> 出現(xiàn)這個(gè)異常是因?yàn)閭鬏敵瑫r(shí)造成的??梢孕薷?。</p><p> 打開windows—Preference—androi
47、d—DDMS</p><p> 把ADB connection tine out 項(xiàng)的超時(shí)時(shí)間改大點(diǎn)。</p><p> 3音樂播放器的詳細(xì)設(shè)計(jì)</p><p> 3.1 播放器主界面的設(shè)計(jì)和說明</p><p> Android的每一個(gè)可視化界面,都有其唯一的布局配置文件,該文件里面有各種布局方式,各種資源文件如圖像,文字,顏色的引
48、用,程序在運(yùn)行時(shí),可以通過代碼對(duì)配置文件進(jìn)行讀取。這樣就可以形成不同的可視化界面和絢麗的效果。</p><p> 主界面布局文件內(nèi)容如下:</p><p> <?xml version="1.0" encoding="utf-8"?></p><p> <AbsoluteLayout xmlns:and
49、roid="http://schemas.android.com/apk/res/android"</p><p> android:id="@+id/AbsoluteLayout01"</p><p> android:layout_width="wrap_content"</p><p> and
50、roid:layout_height="fill_parent"</p><p> android:background="@drawable/backgrund"</p><p> android:sharedUserId="com.android.activitygrouptest"</p><p>
51、;<b> ></b></p><p> 此處的ListView作用為列出歌曲</p><p> <ListView </p><p> android:id="@id/android:list" </p><p> android:layout_width="fill
52、_parent" </p><p> android:layout_height="fill_parent" </p><p> android:layout_weight="1" </p><p> android:drawSelectorOnTop="false"/></p
53、><p> <LinearLayout</p><p> android:layout_width="fill_parent"</p><p> android:layout_height="wrap_content"</p><p> android:gravity="center
54、"</p><p> android:orientation="horizontal" ></p><p> 此處的ImageButton用于第一曲</p><p> <ImageButton</p><p> android:id="@+id/music_lasted"&
55、lt;/p><p> android:layout_width="wrap_content"</p><p> android:layout_height="wrap_content"</p><p> android:layout_marginRight="5dp"</p><p&g
56、t; android:src="@drawable/latest1" /></p><p> 此處的ImageButton用于上一曲</p><p> <ImageButton</p><p> android:id="@+id/music_rewind"</p><p> and
57、roid:layout_width="wrap_content"</p><p> android:layout_height="wrap_content"</p><p> android:layout_marginRight="5dp"</p><p> android:src="@dr
58、awable/rewind" /></p><p> 此處的ImageButton用于播放與暫停</p><p> <ImageButton</p><p> android:id="@+id/music_play"</p><p> android:layout_width="wr
59、ap_content"</p><p> android:layout_height="wrap_content"</p><p> android:layout_marginRight="5dp"</p><p> android:src="@drawable/play1" />&l
60、t;/p><p> 此處的ImageButton用于下一曲</p><p> <ImageButton</p><p> android:id="@+id/music_foward"</p><p> android:layout_width="wrap_content"</p>
61、<p> android:layout_height="wrap_content"</p><p> android:layout_marginRight="5dp"</p><p> android:src="@drawable/foward" /></p><p> 此處的Im
62、ageButton用于最后一曲</p><p> <ImageButton</p><p> android:id="@+id/music_next"</p><p> android:layout_width="wrap_content"</p><p> android:layout_
63、height="wrap_content"</p><p> android:src="@drawable/next1" /></p><p> </LinearLayout></p><p><b> 主界面為:</b></p><p> 3.2 And
64、roid媒體播放原理</p><p> Android源程序已經(jīng)為我們封裝了一個(gè)接口類,叫MediaPlayer。該接口在執(zhí)行前需要一個(gè)數(shù)據(jù)源,通過如下四個(gè)步驟:</p><p> 第一步:MediaPlayer.reset(); 復(fù)位操作,為以后的媒體準(zhǔn)備播放做準(zhǔn)備。</p><p> 第二步:傳入歌曲數(shù)據(jù)源,這里也是一個(gè)數(shù)據(jù)源:MediaPlayer.se
65、tDataSource(String path);參數(shù)需要一個(gè)路徑,該接口類在收到路徑后將其轉(zhuǎn)化為數(shù)據(jù)源。</p><p> 第三步:準(zhǔn)備播放數(shù)據(jù)源,調(diào)用MediaPlayer.prepare();</p><p> 第四步:MediaPlayer.start();播放數(shù)據(jù)源,該數(shù)據(jù)源播放后,不再于程序有關(guān),需要調(diào)用MediaPlayer.stop()方法讓其停止或MediaPlaye
66、r.start();讓其啟動(dòng)。</p><p> 3.3 播放功能實(shí)現(xiàn)細(xì)節(jié)</p><p> 為了實(shí)現(xiàn)音樂播放器的基本功能:音樂播放、暫停、停止、上一首、下一首。這里我用事件監(jiān)聽,詳細(xì)如下:</p><p> 3.3.1 播放器播放、暫停、停止等功能</p><p><b> 圖 3.3.1</b></p&
67、gt;<p> 如圖5.4所示:各按鈕水平放置,用的是布局中的線性布局LinearLayout,用方法setOrientation(horizontal);將其設(shè)置為水平。LinearLayout中依次放置第一曲、上一曲、播放與暫停、下一曲、最后一曲按鈕屬性。配置文件代碼結(jié)構(gòu)如下:</p><p> <LinearLayout></p><p> <I
68、mageButton ></ImageButton></p><p> <ImageButton ></ImageButton></p><p> <ImageButton ></ImageButton></p><p> <ImageButton ></ImageButton
69、></p><p> <ImageButton ></ImageButton></p><p> </LinearLayout></p><p> android的媒體播放原理:android源程序已經(jīng)為我們封裝好了一個(gè)接口類,叫MediaPlayer。該接口在執(zhí)行行需要一個(gè)數(shù)據(jù)源,通過如下四個(gè)步驟:</p>
70、;<p> 第一步:MediaPlayer.reset();復(fù)位操作,為以后的媒體準(zhǔn)備播放作準(zhǔn)備。 </p><p> 第二步:傳入歌曲數(shù)據(jù)源,這里也是一個(gè)數(shù)據(jù)流 MediaPlayer.setDataSource(String path);參數(shù)需要傳一個(gè)路徑,該接口類在收到路徑后將其轉(zhuǎn)化為數(shù)據(jù)源。</p><p> 第三步:準(zhǔn)備播放
71、數(shù)據(jù)源,調(diào)用方法MediaPlayer.Prepare();</p><p> 第四步:MediaPlayer.Start();播放數(shù)據(jù)源,該數(shù)據(jù)源播放后,不再與程序 有關(guān),需要用MediaPlayer.Stop()方法讓其停止或MediaPlayer.Start();讓其啟動(dòng);</p><p> 歌曲數(shù)據(jù)源的獲得:要獲得數(shù)據(jù)源,需要我們提供給接口類一個(gè)歌曲存放路徑,而這個(gè)路徑已經(jīng)被事
72、先放到數(shù)據(jù)庫(kù)里了,我們只需要進(jìn)行數(shù)據(jù)庫(kù)進(jìn)行操作。將里面的路徑取出。這里將調(diào)用PlayRackActivity的一個(gè)方法query();代碼算法如下:</p><p> public String query() {</p><p> ContentResolver cr = getContentResolver();</p><p> Uri uri =
73、DBProvider.CONTENT_URI;</p><p> String[] projection = { "path" };</p><p> String selection = "fileName=?";</p><p> String[] selectionArgs = { selectName };<
74、;/p><p> Cursor c=cr.query(uri,projection,selection, selectionArgs, null);</p><p> if (c.moveToFirst()) {</p><p> String path = c.getString(0);</p><p> return pa
75、th;</p><p> }return null;</p><p><b> }</b></p><p> 方法getContentResolver是包android.content.ContextWrapper里面的方法,它會(huì)自動(dòng)的調(diào)用ContentProvider中的關(guān)聯(lián)數(shù)據(jù)庫(kù),我們需用這個(gè)方法就可以操作數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)操作需要一個(gè)U
76、ri 。Uri類似一個(gè)網(wǎng)絡(luò)連接的Url。Uri是數(shù)據(jù)庫(kù)唯一的標(biāo)識(shí),不同的Uri可以操作不同的數(shù)據(jù)庫(kù)表。在查詢數(shù)據(jù)庫(kù)時(shí)需要傳入一個(gè)當(dāng)前播放的歌曲名字,通過歌曲名字來查詢歌曲的路徑。</p><p> 4 Android數(shù)據(jù)庫(kù)設(shè)計(jì)</p><p> 數(shù)據(jù)結(jié)構(gòu)組織和數(shù)據(jù)庫(kù)文件設(shè)計(jì)要根據(jù)不同用途,使用要求等,來決定數(shù)據(jù)的整體組織形式等一系列問題。</p><p> 數(shù)
77、據(jù)庫(kù),顧名思義,是存放數(shù)據(jù)的倉(cāng)庫(kù)。只不過這個(gè)倉(cāng)庫(kù)是在計(jì)算機(jī)存儲(chǔ)設(shè)備上,而且數(shù)據(jù)是按一定的格式存放的。數(shù)據(jù)庫(kù)中的數(shù)據(jù)按一定數(shù)據(jù)模型組織、描述和存儲(chǔ),具有較小的重復(fù)度、較高的數(shù)據(jù)獨(dú)立性和易擴(kuò)展性,并且可以被在一定范圍內(nèi)的各種用戶共享。在涉及數(shù)據(jù)庫(kù)的軟件開發(fā)中,需要根據(jù)有待解決的問題性質(zhì)、規(guī)模,以及所采用的前端程序創(chuàng)建工具等,做出合適的數(shù)據(jù)庫(kù)類型選擇</p><p> 4.1 數(shù)據(jù)庫(kù)及字段屬性設(shè)計(jì)</p>
78、<p> 4.1.1 字段設(shè)計(jì)(表、圖)</p><p> file_table 主要是保存歌曲名字、類型、路徑</p><p> 字段說明:Id 歌曲id號(hào) fileName 歌曲名字 filePath 歌曲路徑 sort 歌曲類型(表4.1、圖4.1.1)</p><p> Android自帶一個(gè)MediaStore封閉類 專門來存儲(chǔ)媒體
79、信息</p><p> 通過Uri EXTERNAL_CONTENT_URI 來訪問SDcard中的歌曲詳細(xì)信息。</p><p> 存放媒體信息如TITLE(標(biāo)題)、ARTIST(藝術(shù)家)、ALBUM(專輯)、SIZE(大小 )(表4.2、圖4.1.2)</p><p><b> 表4.1</b></p><p>
80、;<b> 表4.2</b></p><p> 圖4.1.1 歌曲列表</p><p> 圖4.1.2 歌曲詳細(xì)</p><p> 4.1.2 音樂播放器E-R圖</p><p> 音樂播放器 E-R(實(shí)體-聯(lián)系:entity-relation圖)圖(圖4.1.3)</p><p>
81、圖4.1.3 E-R圖</p><p><b> 4.2 數(shù)據(jù)庫(kù)連接</b></p><p> 這里將介紹如何進(jìn)行Android數(shù)據(jù)庫(kù)連接,Android中自帶SQLite數(shù)據(jù)庫(kù),這是一個(gè)十分小型的數(shù)據(jù)庫(kù),這樣正適合Android這種移動(dòng)平臺(tái)使用。</p><p> Android數(shù)據(jù)庫(kù)存儲(chǔ)的位置在data/data/<項(xiàng)目文件夾
82、>/databases/目錄下 Android是利用ContentProvider作為內(nèi)容提供商,SQLiteOpenHelper數(shù)據(jù)庫(kù)幫助類來進(jìn)行對(duì)數(shù)據(jù)庫(kù)的創(chuàng)建和操作。通過Context.getContentResolver()方法直接對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。程序中數(shù)據(jù)庫(kù)類為DBHelper extends SQLiteOpenHelper(繼承關(guān)系),內(nèi)容提供類DBProvider extends ContentProvid
83、er(繼承關(guān)系)</p><p> 4.2.1 創(chuàng)建數(shù)據(jù)庫(kù)</p><p> Android 提供了標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)創(chuàng)建方式。繼承SQLiteOpenHelper ,實(shí)現(xiàn)onCreate 和 onUpgrade 兩個(gè)方法,有個(gè)好處就是便于數(shù)據(jù)庫(kù)版本的升級(jí),連接數(shù)據(jù)庫(kù)的算法如下:</p><p> public DBHelper(Context context) {
84、// 創(chuàng)建數(shù)據(jù)庫(kù)</p><p> super(context, DATABASE_NAME,null, DATABASE_VERSION);</p><p><b> }</b></p><p> public void onCreate(SQLiteDatabase db) {// 創(chuàng)建時(shí)調(diào)用</p><p>
85、 db.execSQL(DATABASE_CREATE);</p><p><b> }</b></p><p> public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 版本更新時(shí)調(diào)用</p><p> db.execSQL(&qu
86、ot;DROP TABLE IF EXISTS File_Table");</p><p> onCreate(db);</p><p><b> }</b></p><p> @Override // 在ContextProvider運(yùn)行時(shí)自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù) </p><p> public b
87、oolean onCreate() {</p><p> dbOpenHelper= new DBHelper(getContext());</p><p> return true;</p><p><b> }</b></p><p> 數(shù)據(jù)庫(kù)如果創(chuàng)建不成功則拋出FIleNotFoundException異常
88、</p><p> 4.2.2 操作數(shù)據(jù)庫(kù)</p><p> Android對(duì)數(shù)據(jù)庫(kù)的操作主要有插入、刪除、更新、查詢操作,在進(jìn)行任何操作時(shí)都必須指定一個(gè)Uri,才能對(duì)相應(yīng)的表進(jìn)行數(shù)據(jù)操作。</p><p><b> //數(shù)據(jù)庫(kù)刪除操作</b></p><p><b> @Override</b&
89、gt;</p><p> public int delete(Uri arg0, String arg1, String[] arg2) {</p><p> SQLiteDatabase db = dbOpenHelper.getWritableDatabase();</p><p><b> try {</b></p>
90、<p> Db.delete(FileColumn.TABLE, arg1, arg2);</p><p> } catch (Exception ex) {</p><p> ex.printStackTrace();</p><p> }return 1;</p><p><b> }</b>&l
91、t;/p><p> @Override//數(shù)據(jù)庫(kù)插入操作</p><p> public Uri insert(Uri uri, ContentValues values) {</p><p> SQLiteDatabase db = dbOpenHelper.getWritableDatabase();</p><p> long co
92、unt = 0;</p><p> try { count = db.insert(FileColumn.TABLE, null, values);</p><p> } catch (Exception ex) </p><p> { ex.printStackTrace(); }</p><p> if (count > 0
93、) return uri;</p><p> else return null;</p><p><b> }</b></p><p> // 數(shù)據(jù)庫(kù)更新操作</p><p><b> @Override</b></p><p> public int update
94、(Uri uri, ContentValues values, String selection,String[] selectionArgs) {</p><p> SQLiteDatabase db = dbOpenHelper.getWritableDatabase();</p><p> int i = 0;</p><p><b> try
95、 {</b></p><p> i = db.update(FileColumn.TABLE, values, selection, null);return i;</p><p> } catch (Exception ex) {}</p><p><b> return 0;</b></p><p>
96、;<b> }</b></p><p> 4.2.3 數(shù)據(jù)顯示</p><p> 程序是利用Cursor游標(biāo)類指向數(shù)據(jù)表中的某一項(xiàng),然后進(jìn)行查詢數(shù)據(jù),用Log日志顯示出來</p><p> @Override//數(shù)據(jù)庫(kù)查詢操作</p><p> public Cursor query(Uri uri, Stri
97、ng[] projection, String selection,String[] selectionArgs, String sortOrder) {</p><p> SQLiteDatabase db = dbOpenHelper.getWritableDatabase();</p><p> // 依次參數(shù)為:表名,查詢字段,where語句,替換,group by(分組),h
98、aving(分組條件),order by(排序)</p><p> Cursor cur = db.query(FileColumn.TABLE, projection, selection,selectionArgs, null, null, sortOrder);return cur;}</p><p><b> 5軟件測(cè)試</b></p>&l
99、t;p><b> 5.1 軟件的測(cè)試</b></p><p> 一個(gè)程序并不可能達(dá)到十分完美,難免存在一些錯(cuò)誤。如果不能及時(shí)將其找出并修改,會(huì)造成系統(tǒng)崩潰并造成不必要的損失。通過軟件測(cè)試,盡可能多的找出系統(tǒng)中的錯(cuò)誤,以便于及時(shí)修改。</p><p> 5.1.1 軟件測(cè)試的環(huán)境</p><p> 1、軟件測(cè)試的性能要求</p
100、><p> 軟硬件要求:系統(tǒng)環(huán)境 winXP;硬件系統(tǒng)環(huán)境 P4 2.4、1024MB內(nèi)存、80G硬盤。系統(tǒng)運(yùn)行時(shí)對(duì)數(shù)據(jù)的保密性要求不高對(duì)一般的數(shù)據(jù)不要求進(jìn)行加密。此外,對(duì)其他軟件幾乎沒有依賴性,程序健壯性較好。</p><p><b> 2、測(cè)試</b></p><p> 建立一張模擬的SD卡,上傳歌曲文件;分別測(cè)試其的播放、暫停、停止、上
101、/下一首的功能是否有用。 </p><p><b> 3、軟件測(cè)試的評(píng)價(jià)</b></p><p> 軟件功能評(píng)價(jià):此軟件各模塊都能實(shí)現(xiàn)各自的功能,基本符合播放音樂的要求。</p><p> 結(jié)論:此軟件是可行的。</p><p> 5.1.2 測(cè)試階段</p><p> 軟件測(cè)試是一項(xiàng)復(fù)
102、雜的系統(tǒng)工程,從不同的角度考慮可以有不同的劃分方法,對(duì)測(cè)試進(jìn)行分類是為了更好的明確測(cè)試的過程,了解測(cè)試究竟要完成哪些工作,盡量做到全面測(cè)試。按照軟件測(cè)試的策略和過程分類,軟件測(cè)試可分為單元測(cè)試、集成測(cè)試、確認(rèn)測(cè)試、系統(tǒng)測(cè)試和驗(yàn)收測(cè)試。它們被依次順序地執(zhí)行,如圖5-1所示:</p><p> 圖 5-1 軟件測(cè)試分級(jí)模型</p><p><b> 1、單元測(cè)試</b>
103、;</p><p> 單元測(cè)試是對(duì)軟件中的基本組成單位進(jìn)行的測(cè)試,如一個(gè)模塊、一個(gè)過程等等。它是軟件動(dòng)態(tài)測(cè)試的最基本的部分,也是最重要的部分之一,其目的是檢驗(yàn)軟件基本組成單位的正確性。因?yàn)閱卧獪y(cè)試需要知道內(nèi)部程序設(shè)計(jì)和編碼的細(xì)節(jié)知識(shí),一般應(yīng)由程序員而非測(cè)試員來完成,往往需要開發(fā)測(cè)試驅(qū)動(dòng)模塊和樁模塊來輔助完成單元測(cè)試。因此應(yīng)用系統(tǒng)有一個(gè)設(shè)計(jì)很好的體系結(jié)構(gòu)就顯得尤為重要。 </p><p>
104、 一個(gè)軟件單元的正確性是相對(duì)于該單元的規(guī)約而言的。因此,單元測(cè)試以被測(cè)試單位的規(guī)約為基準(zhǔn)。單元測(cè)試的主要方法有控制流測(cè)試、數(shù)據(jù)流測(cè)試、排錯(cuò)測(cè)試、分域測(cè)試等等。</p><p><b> 2、集成測(cè)試</b></p><p> 集成測(cè)試是在軟件系統(tǒng)集成過程中所進(jìn)行的測(cè)試,其主要目的是檢查軟件單位之間的接口是否正確。它根據(jù)集成測(cè)試計(jì)劃,一邊將模塊或其他軟件單位組合成
105、越來越大的系統(tǒng),一邊運(yùn)行該系統(tǒng),以分析所組成的系統(tǒng)是否正確,各組成部分是否合拍。集成測(cè)試的策略主要有自頂向下和自底向上兩種。在此采用自頂向下策略,從網(wǎng)站主頁開始進(jìn)入,測(cè)試每個(gè)模塊之間的聯(lián)系是否合理,如前臺(tái)展示與后臺(tái)管理的接口等。</p><p><b> 3、確認(rèn)測(cè)試</b></p><p> 確認(rèn)測(cè)試又稱有效性測(cè)試。它的任務(wù)是驗(yàn)證軟件的有效性,即驗(yàn)證軟件的功能和
106、性能及其它特性是否與用戶的要求一致。在軟件需求規(guī)格說明書中描述了全部用戶可見的軟件屬性,其中有一節(jié)叫做有效性準(zhǔn)則,它包含的信息就是軟件確認(rèn)測(cè)試的基礎(chǔ)。</p><p><b> 4、系統(tǒng)測(cè)試</b></p><p> 系統(tǒng)測(cè)試是對(duì)已經(jīng)集成好的軟件系統(tǒng)進(jìn)行徹底的測(cè)試,以驗(yàn)證軟件系統(tǒng)的正確性和性能等滿足其規(guī)約所指定的要求,檢查軟件的行為和輸出是否正確并非一項(xiàng)簡(jiǎn)單的任務(wù)
107、,它被稱為測(cè)試的“先知者問題”。因此,系統(tǒng)測(cè)試應(yīng)該按照測(cè)試計(jì)劃進(jìn)行,其輸入、輸出和其他動(dòng)態(tài)運(yùn)行行為應(yīng)該與軟件規(guī)約進(jìn)行對(duì)比。軟件系統(tǒng)測(cè)試方法很多,主要有功能測(cè)試、性能測(cè)試、隨機(jī)測(cè)試等等。</p><p><b> 5、驗(yàn)收測(cè)試</b></p><p> 驗(yàn)收測(cè)試旨在向軟件的購(gòu)買者展示該軟件系統(tǒng)滿足其用戶的需求。它的測(cè)試數(shù)據(jù)通常是系統(tǒng)測(cè)試的測(cè)試數(shù)據(jù)的子集。這是軟件在投
108、入使用之前的最后測(cè)試。</p><p><b> 6結(jié)論</b></p><p> 本文通過本系統(tǒng)設(shè)計(jì)與開發(fā),從而得出下列結(jié)論: </p><p> 1、學(xué)習(xí)一門新技術(shù),最重要的是實(shí)踐,只有多動(dòng)手才能盡快掌握它。</p><p> 2、一個(gè)系統(tǒng)的開發(fā),經(jīng)驗(yàn)是最重要的,經(jīng)驗(yàn)不足,就難免會(huì)有許多考慮不周之處。&
109、lt;/p><p> 3、要想吸引更多的用戶,系統(tǒng)的界面必須要美觀、友好,功能要健全。不過由于經(jīng)驗(yàn)不足,我設(shè)計(jì)的圖形界面比較簡(jiǎn)單。只是對(duì)基本功能進(jìn)行了開發(fā)。</p><p> 4、本次開發(fā),我參考了很多本系統(tǒng)的例子,吸取了一些別的本系統(tǒng)的長(zhǎng)處,對(duì)自己的畢業(yè)設(shè)計(jì)進(jìn)行了完善,但是還有很多的不足之處,有待以后進(jìn)一步學(xué)習(xí)。</p><p> 本文所制作的系統(tǒng)界面友好、使用
110、靈活、操作簡(jiǎn)單、功能齊全、表現(xiàn)方式獨(dú)特,已基本具備了成熟的技術(shù)理論。</p><p> 由于時(shí)間倉(cāng)促,本次設(shè)計(jì)由我完成本系統(tǒng)的制作,對(duì)我這樣一個(gè)JSP新手而言所制作的模塊還有不完善的地方。由于是獨(dú)立完成,在畢業(yè)設(shè)計(jì)的過程遇到了很多的困難,我求教了不少老師和同學(xué),在這個(gè)過程中讓我體會(huì)到了,一個(gè)團(tuán)隊(duì)的重要性。</p><p> 通過對(duì)Android手機(jī)平臺(tái)的音樂播放器的開發(fā),使我對(duì)Andr
111、oid系統(tǒng)從零進(jìn)入到了一個(gè)比較高的層次的了解,Android功能是如此強(qiáng)大,令人不得不佩服。</p><p> 在實(shí)現(xiàn)播放器的基本功能是,一開始我是不知道要用什么來做了,直到問了同學(xué)和查看書籍資料,才知道用了一個(gè)監(jiān)聽的方法解決掉。</p><p> 因?yàn)樽约簩?duì)Android的掌握不是很好,播放器不夠完善,有些地方還有些不合理的地方,比如歌詞方面,這需要改善,有待以后去加強(qiáng)。</p
112、><p><b> 致 謝</b></p><p> 在本次畢業(yè)論文過程中,得到了指導(dǎo)老師的指導(dǎo)與支持。在此特別感謝指導(dǎo)老師的大力幫助。指導(dǎo)老師的悉心指導(dǎo)和大力支持,在總體結(jié)構(gòu)、功能的把握上給予了非常大的幫助,同時(shí)根我們提供了非常優(yōu)越的設(shè)計(jì)環(huán)境,并對(duì)我在編程設(shè)計(jì)等細(xì)節(jié)工作上給予了耐心的指導(dǎo),對(duì)于我順利完成這次畢業(yè)論文起到了關(guān)鍵性的作用。通過開發(fā)本系統(tǒng),我較全面的掌
113、握了android基本知識(shí)和編程技巧,并在開發(fā)過程中我的java開發(fā)能力得到了進(jìn)一步的提高。</p><p> 在開發(fā)過程中我學(xué)到了一些經(jīng)驗(yàn):系統(tǒng)分析的好壞將決定著的系統(tǒng)開發(fā)成功與否,一份好分析設(shè)計(jì)將是成功開發(fā)主要因素。我們?cè)谥珠_發(fā)之前不要急于編程,先應(yīng)有較長(zhǎng)的時(shí)間去把分析做好,寫出相關(guān)的開發(fā)文檔等。然后再開始編寫程序代碼,這樣做到每寫一步代碼心底有數(shù),有條不絮。當(dāng)然也有些還需待繼續(xù)深入地方如:菜單功能的實(shí)現(xiàn)
114、問題等等。</p><p><b> 參 考 文 獻(xiàn)</b></p><p> 專著:[M]作者:余志龍 陳昱勛 鄭名杰 陳小鳳 郭秩均.</p><p> 書名[M]:Google Android SDK開發(fā)范例大全(第二版).</p><p><b> 出版地:北京</b></p&
溫馨提示
- 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. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于android平臺(tái)的音樂播放器-畢業(yè)論文
- 畢業(yè)論文——基于android平臺(tái)的音樂播放器
- 畢業(yè)論文——基于android音樂播放器的設(shè)計(jì)
- 基于android的音樂播放器的設(shè)計(jì)-畢業(yè)論文
- 基于android手機(jī)平臺(tái)的音樂播放器-畢業(yè)論文
- 基于android手機(jī)平臺(tái)的音樂播放器【畢業(yè)論文】
- 畢業(yè)論文基于android手機(jī)平臺(tái)的音樂播放器
- 畢業(yè)論文范文——android音樂播放器
- 畢業(yè)論文設(shè)計(jì) 基于android手機(jī)平臺(tái)的音樂播放器
- 基于android開發(fā)音樂播放器的設(shè)計(jì)-畢業(yè)論文
- 基于android平臺(tái)的音樂播放器設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 基于Android音樂播放器的設(shè)計(jì)與開發(fā)畢業(yè)論文.doc
- 基于android平臺(tái)的音樂播放器設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 【畢業(yè)課題論文】android手機(jī)平臺(tái)音樂播放器
- 畢業(yè)論文--android在線音樂播放器設(shè)計(jì)與實(shí)現(xiàn)
- 軟件工程畢業(yè)論文-基于android系統(tǒng)的音樂播放器的實(shí)現(xiàn)
- 畢業(yè)設(shè)計(jì)(論文)基于android手機(jī)平臺(tái)的音樂播放器
- android平臺(tái)的音樂視頻播放器論文
- 軟件工程畢業(yè)論文-基于android的音樂播放器的設(shè)計(jì)與實(shí)現(xiàn)
- 軟件工程畢業(yè)論文-基于android系統(tǒng)的音樂播放器的實(shí)現(xiàn)2
評(píng)論
0/150
提交評(píng)論