最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

基于android音樂(lè)播放器的設(shè)計(jì)

2022-12-14 00:19 作者:考研保研直通車  | 我要投稿

本科畢業(yè)論文(設(shè)計(jì))誠(chéng)信聲明

本人鄭重聲明:所呈交的畢業(yè)論文(設(shè)計(jì)),題目《………基于android音樂(lè)播放器的設(shè)計(jì)……………………………》是本人在指導(dǎo)教師的指導(dǎo)下,進(jìn)行研究工作所取得的成果。對(duì)本文的研究作出重要貢獻(xiàn)的個(gè)人和集體,均已在文章以明確方式注明。除此之外,本論文(設(shè)計(jì))不包含任何其他個(gè)人或集體已經(jīng)發(fā)表或撰寫過(guò)的作品成果。本人完全意識(shí)到本聲明應(yīng)承擔(dān)的責(zé)任。

摘 要

本文說(shuō)明了制作音樂(lè)播放器所用的技術(shù),制作流程和功能介紹。

Android是一個(gè)開(kāi)源的系統(tǒng),它底層是基于Linux的操作系統(tǒng),本論文的音樂(lè)播放器采用了Android開(kāi)源系統(tǒng)技術(shù),利用Java語(yǔ)言和Eclipse編輯工具對(duì)播放器進(jìn)行編寫。同時(shí)給出了詳細(xì)的系統(tǒng)設(shè)計(jì)過(guò)程、部分界面圖及主要功能運(yùn)行流程圖,本文還對(duì)調(diào)試過(guò)程中遇到的問(wèn)題和解決方法進(jìn)行了詳細(xì)的討論。

通過(guò)制作這個(gè)軟件,我豐富了見(jiàn)聞,接觸了曾經(jīng)沒(méi)有涉獵的技術(shù)領(lǐng)域。同時(shí)也系統(tǒng)地復(fù)習(xí)了android和java語(yǔ)言,可以說(shuō)是收獲頗豐。

該播放器能流暢的播放所有MP3文件,操作流暢,使用方便。

關(guān)鍵詞: 界面; 服務(wù);網(wǎng)絡(luò)爬蟲;數(shù)據(jù)庫(kù);消息機(jī)制

ABSTRACT

This paper illustrates the production technology used in the music player, production processes and functions is introduced.
Android 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 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 the Java language, can be said to be fruitful.
The player can smooth play all MP3 files, smooth operation, easy to use..

Keywords:?fragment and activity; service; Jsoup; SqliteDataBase;Handler

目 錄

第1章 引言44

1.1 項(xiàng)目背景44

1.2 編寫目的44

第2章 系統(tǒng)需求分析55

2.1 功能需求55

2.1.1 播放器基本控制需求55

2.1.2 網(wǎng)絡(luò)歌曲需求66

2.1.2 歌詞顯示需求77

2.2 界面需求88

2.3 系統(tǒng)結(jié)構(gòu)圖和流程圖1010

2.4 性能需求1111

2.5運(yùn)行環(huán)境需求1111

第3章 Android項(xiàng)目介紹1212

3.1 什么是Android?1212

3.2 Android工程目錄結(jié)構(gòu)1313

第4章 播放器系統(tǒng)功能詳細(xì)設(shè)計(jì)1515

4.1 播放音樂(lè)與模式1515

4.2 收藏音樂(lè)1717

4.3 音樂(lè)切換時(shí)界面狀態(tài)改變1919

4.4 網(wǎng)絡(luò)歌曲下載1919

4.5 歌詞滾動(dòng)顯示2121

結(jié) 論2222

致 謝2828

附 錄2929

第1章 引言

Android開(kāi)發(fā)是當(dāng)今兩大手機(jī)開(kāi)發(fā)之一,另一個(gè)便是IOS系統(tǒng)。它的優(yōu)勢(shì)在于廣泛的用戶量,開(kāi)發(fā)門檻較低。而蘋果系統(tǒng)雖然運(yùn)行流暢,它有垃圾處理機(jī)制,使手機(jī)運(yùn)行十幾個(gè)軟件都不卡;但相對(duì)開(kāi)發(fā)較難,而且開(kāi)發(fā)環(huán)境配置要求高,不便于平民開(kāi)發(fā)。更主要是Android優(yōu)點(diǎn)在于開(kāi)放性,能接受海量的應(yīng)用程序,包括一些個(gè)人自創(chuàng)程序軟件,所以安卓的軟件會(huì)比較豐富,而這點(diǎn)也正是IOS特點(diǎn)所缺少并且堅(jiān)持的,只接受承認(rèn)應(yīng)用程序,并且非免費(fèi)程序很多。

1.1 項(xiàng)目背景

在廣大安卓手機(jī)用戶的前提下,java走android路線也像web路線有很好的前途,個(gè)人立志在java領(lǐng)域能熟悉有關(guān)java的所有技術(shù),然后擇其一發(fā)展。此次畢業(yè)設(shè)計(jì)是一個(gè)基于android在線音樂(lè)播放器,主要用于綜合android技術(shù),熟練使用各種組件,以及一個(gè)完整android項(xiàng)目所碰到的難題。

隨著社會(huì)迅速的發(fā)展,人們有忙不完的工作,如何在忙碌中享受生活,智能手機(jī)的普遍使得聽(tīng)音樂(lè)成為了一個(gè)不錯(cuò)的舒緩選擇;在這樣的背景下我制做了一款集本地和在線播放,下載和歌詞顯示以及播放模式于一體的基于android系統(tǒng)的音樂(lè)播放器。同時(shí)也鍛煉了自己的專業(yè)技能,對(duì)大學(xué)四年也有一個(gè)圓滿的答卷。

1.2 編寫目的

作為一個(gè)畢業(yè)設(shè)計(jì),我覺(jué)得應(yīng)該把我們學(xué)過(guò)的專業(yè)知識(shí)總結(jié)出來(lái),應(yīng)用在項(xiàng)目中,我的android音樂(lè)播放器就是java和android這一塊最好的總結(jié),它使用eclipse adt編寫java和android代碼及其布局文件實(shí)現(xiàn)界面與數(shù)據(jù)的交互,通過(guò)觀察者設(shè)計(jì)模式制作手機(jī)軟件,不僅達(dá)到了鍛煉自己專業(yè)技術(shù)能力的目的,而且鞏固了大學(xué)課程的知識(shí)。豐富了我們見(jiàn)聞,也為以后找工作打下堅(jiān)實(shí)的基礎(chǔ)。

第2章 系統(tǒng)需求分析

2.1 功能需求

2.1.1 播放器基本控制需求

用例圖表示如下:

圖2.1.1 播放器基本控制功能用例圖

用例名稱:播放;參與者:用戶;目標(biāo):播放選中列表的歌曲;

前置條件:播放器正在運(yùn)行;基本事件流:點(diǎn)擊“播放”按鈕實(shí)現(xiàn)當(dāng)前歌曲的播放。

用例名稱:暫停;參與者:用戶;目標(biāo):暫停當(dāng)前播放的歌曲;

前置條件:播放器正在運(yùn)行且正在播放;基本事件流:點(diǎn)擊“暫?!卑粹o實(shí)現(xiàn)暫停歌曲。

用例名稱:上一首;參與者:用戶;目標(biāo):跳轉(zhuǎn)播放當(dāng)前歌曲的上一首歌曲;

前置條件:正在播放或暫停;基本事件流:點(diǎn)擊“上一首”按鈕實(shí)現(xiàn)上一首歌曲的播放。

用例名稱:下一首;參與者:用戶;目標(biāo):跳轉(zhuǎn)播放當(dāng)前歌曲的下一首歌曲;

前置條件:正在播放或暫停;基本事件流:點(diǎn)擊“下一首”按鈕實(shí)現(xiàn)下一首歌曲的播放。

2.1.2 網(wǎng)絡(luò)歌曲需求

用例圖表示如下:

圖2.1.2 網(wǎng)絡(luò)請(qǐng)求用例圖

用例名稱:歌曲下載;參與者:用戶;目標(biāo):在線類別選中的歌曲;

前置條件:播放器正在運(yùn)行;基本事件流:點(diǎn)擊“下載”按鈕實(shí)現(xiàn)對(duì)應(yīng)選中歌曲的下載。

用例名稱:在線播放;參與者:用戶;目標(biāo):播放在線列表選中的歌曲;

前置條件:播放器正在運(yùn)行;基本事件流:點(diǎn)擊“列表中的Item”播放選中的在線歌曲。

用例名稱:網(wǎng)上搜索;參與者:用戶;目標(biāo):跳轉(zhuǎn)到搜索結(jié)果顯示列表;

前置條件:播放器正在運(yùn)行;基本事件流:輸入搜索關(guān)鍵字點(diǎn)擊“搜索”按鈕返回網(wǎng)路音樂(lè)查詢結(jié)果。

2.1.2 歌詞顯示需求

用例圖表示如下:

圖2.1.2 歌詞顯示用例圖

用例名稱:歌詞滾動(dòng)顯示;參與者:播放器系統(tǒng);目標(biāo):當(dāng)前播放歌詞的滾動(dòng)顯示;

前置條件:歌曲正在播放;基本事件流:點(diǎn)擊“播放”按鈕后選中“正在播放”的tab頁(yè)。

用例名稱:狀態(tài)量改變;參與者:播放器系統(tǒng);目標(biāo):切換列表的歌曲在播放頁(yè)面改變狀態(tài)欄;

前置條件:播放器正在運(yùn)行;基本事件流:切換歌曲時(shí)播放頁(yè)面的狀態(tài)圖標(biāo)改變。

用例名稱:播放進(jìn)度顯示;參與者:播放器系統(tǒng);目標(biāo):實(shí)時(shí)播放進(jìn)度更新;

前置條件:歌曲正在播放;基本事件流:切換到“正在播放”tab頁(yè)的歌曲進(jìn)度條實(shí)時(shí)變化。

2.2 界面需求

一個(gè)軟件除了功能外,優(yōu)秀的UI界面影響著用戶的使用體驗(yàn)。是一個(gè)能改變用戶看法,增加用戶數(shù)量的主要因素。這里就要我們熟練的使用Android的各種組件和界面控件,尤其是布局方式:線性布局,相對(duì)布局,幀布局,絕對(duì)布局;而線性布局又分為表格布局,網(wǎng)格布局等;它們的正確使用既能幫助我們?nèi)蘸竺阑缑妫帜苁拐麄€(gè)軟件看起來(lái)工整無(wú)暇。

我的界面做得一般,不夠華麗但也很清新,這個(gè)音樂(lè)播放器包括五大界面,收藏界面,播放界面,列表界面,在線音樂(lè)界面,下載界面;采用統(tǒng)一的顏色格調(diào),操作流暢,代碼結(jié)構(gòu)嚴(yán)謹(jǐn),可讀性強(qiáng)。操作也很簡(jiǎn)便,是一款適用于休閑的音樂(lè)播放軟件。

界面截圖如下:




這里展示了播放界面,網(wǎng)絡(luò)界面,本地列表界面和收藏界面。

其他還有長(zhǎng)按歌曲彈出刪除分享菜單和登陸注冊(cè),

實(shí)現(xiàn)分享到微信,qq,微博的功能,

以及根據(jù)儲(chǔ)存路徑刪除音樂(lè)文件和根據(jù)id刪除mediastore的歌曲記錄。

登陸注冊(cè)是一個(gè)自定義的alertdialog彈出框,寫入sqlitedatabase進(jìn)行驗(yàn)證判斷

2.3 系統(tǒng)結(jié)構(gòu)圖和流程圖


程序開(kāi)始

進(jìn)入歡迎界面


本地列表界面

播放界面



網(wǎng)絡(luò)歌曲界面



是否顯示全部音樂(lè)?

是否顯示全部音樂(lè)?

是否顯示全部音樂(lè)?



狀態(tài)不變



是否下載?



播放列表

播放列表



是否點(diǎn)擊播放列表選項(xiàng)?

是否點(diǎn)擊播放列表選項(xiàng)?

下載并進(jìn)入下載界面



音樂(lè)播放

播放下一首/上一首



程序結(jié)束


2.4 性能需求

性能方面我做了如下優(yōu)化:

1、java類的歸并,歸并冗長(zhǎng)的重復(fù)的代碼。

2、在對(duì)sqlite數(shù)據(jù)庫(kù)做了查詢優(yōu)化。

3、下次進(jìn)入播放器依舊保存著上次的設(shè)置和播放位置,狀態(tài)量保存完好。

4、采用觀察者設(shè)計(jì)模式,優(yōu)化了代碼結(jié)構(gòu)。

2.5運(yùn)行環(huán)境需求

開(kāi)發(fā)工具:

Android SDK,eclipse adt22

運(yùn)行環(huán)境:

在windows7,jdk1.6和android環(huán)境下使用eclipse編寫代碼

在adv4.4和android測(cè)試真機(jī)上調(diào)試運(yùn)行

第3章 Android項(xiàng)目介紹

3.1 什么是Android?

1、什么是Android?這個(gè)問(wèn)題從不同的角度來(lái)說(shuō)有不同的答案!

在普通用戶眼中,它是一個(gè)智能手機(jī)操作系統(tǒng),擁有很多功能。

在android程序員眼中,它就是一個(gè)程序運(yùn)行環(huán)境,許多功能都需要編寫然后再添加到系統(tǒng)中實(shí)現(xiàn)運(yùn)行。它也是一個(gè)開(kāi)源的框架,任何人都可以自己給他添加代碼,改變樣式和功能。

官方介紹:Android是一種基于Linux的自由及開(kāi)放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,由Google公司和開(kāi)放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開(kāi)發(fā)。

  1. Android系統(tǒng)的四大組件

  2. Activity:提供可視化用戶界面,一個(gè)android程序通常由多個(gè)Activity組成,它有自己的生命周期,由Android系統(tǒng)控制。

  3. Service:運(yùn)行在后臺(tái)的一種服務(wù)程序,它很少和用戶交互,因此沒(méi)有可視化界面,定義一個(gè)Service很容易,只需繼承Service類實(shí)現(xiàn)其生命周期中的方法;它必須在清單文件中注冊(cè)才能使用。

  4. BroadcastReceiver:顧名思義廣播接收器,它和事件處理機(jī)制類似,只
    不過(guò)事件處理機(jī)制是程序組件級(jí)別的(例如,某個(gè)按鈕的單擊事件),而廣播事件處理機(jī)制是系統(tǒng)級(jí)別的。到目前為止我們可以使用Intent來(lái)啟動(dòng)一個(gè)程序組件,我們還可以通過(guò)使用sendBroadcast()方法來(lái)發(fā)起一個(gè)系統(tǒng)級(jí)別的事件廣播來(lái)傳遞消息。我們可以在你的應(yīng)用程序中實(shí)現(xiàn)Broadcast Receiver來(lái)監(jiān)聽(tīng)和響應(yīng)這些廣播的Intent。

  5. ContentProvider:用來(lái)保存和檢索數(shù)據(jù),并且使應(yīng)用程序之間相互訪問(wèn)

數(shù)據(jù)成為可能。它是跨應(yīng)用程序共享數(shù)據(jù)的唯一方法。

Android系統(tǒng)有如下的幾大特性:

? 應(yīng)用程序框架 支持組件的重用與替換 ?

Dalvik虛擬機(jī) 專門為移動(dòng)設(shè)備做了優(yōu)化

? 內(nèi)部集成瀏覽器 該瀏覽器基于開(kāi)源的WebKit引擎

? 優(yōu)化的圖形庫(kù) 包括2D和3D圖形庫(kù),3D圖形庫(kù)基于OpenGL ES ?

SQLite 用作結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)

? 多媒體支持 包括常見(jiàn)的音頻、視頻和靜態(tài)印象文件格式

? GSM電話,藍(lán)牙Bluetooth,EDGE,3G and WiFi,照相機(jī),GPS,指南針,和加速度計(jì)?

豐富的開(kāi)發(fā)環(huán)境 包括設(shè)備模擬器,調(diào)試工具,內(nèi)存及性能分析圖表,和Eclipse集成開(kāi)發(fā)環(huán)境插件

3.2 Android工程目錄結(jié)構(gòu)

如圖:

下面我來(lái)詳細(xì)介紹一下它的每一個(gè)目錄的作用

res目錄

主要是用來(lái)存放android項(xiàng)目的各種資源文件,res就是resource單詞的縮寫。該目錄幾乎存放了android應(yīng)用所用的全部資 源,包括:圖片資源、字符串資源、顏色資源、尺寸資源,以及布局文件等。不同的文件存放在不同的目錄當(dāng)中,在res目錄下面又有下一級(jí)目錄:

  1. layout目錄主要是存放布局文件,比如主界面布局文件main.xml就在這里面。我們可以在頁(yè)面中加入各種界面顯示的控件。

  2. menu目錄主要是存放菜單文件,現(xiàn)在在android開(kāi)發(fā)中使用菜單不是很頻繁,比如手機(jī)很多軟件在點(diǎn)擊菜單按鈕是彈出來(lái)的對(duì)話框的布局就是放在這個(gè)目錄當(dāng)中。

  3. valus目錄主要是存放一些數(shù)值,比如字符串資源存放在strings.xml中,color.xml可以被定義成存儲(chǔ)顏色的代碼文件;style.xml主題樣式;dimens.xml存尺寸元素。

  4. drawable目錄都是用來(lái)存放圖片元素的,可根據(jù)圖片的大小像素決定存儲(chǔ)位置。

assets目錄

主要存放二進(jìn)制資源文件或網(wǎng)頁(yè)等等,如音樂(lè),影視,html文件等等。

src目錄

主要存放java源代碼,我們一般把不同類別的java文件分開(kāi)包裝,增強(qiáng)可讀性。

gen目錄

android工程自動(dòng)生成的文件,如R.java文件

bin目錄

自動(dòng)生成的二進(jìn)制文件和編譯后生成的文件

libs目錄

存放引用的java第三方j(luò)ar包

AndroidManifest.xml文件

Android工程的配置清單文件,也是整個(gè)android應(yīng)用的全局描述文件。清單文件說(shuō)明了android應(yīng)用的名稱、所使用的圖標(biāo)以及包含的組件等,主要包括:

1、應(yīng)用程序的包名,該包名將會(huì)作為該android應(yīng)用的唯一標(biāo)識(shí)。

2、應(yīng)用程序包含的組件,如activity、server、broadcastreceier、contentprovider等,這個(gè)就告訴我們?cè)谛陆ㄒ粋€(gè)類繼承這些組件時(shí),我們要在清單文件中進(jìn)行注冊(cè)一下,否則應(yīng)用程序在執(zhí)行時(shí)會(huì)報(bào)錯(cuò),無(wú)法找到相應(yīng)的類。

3、應(yīng)用程序兼容的最低版本。

4、應(yīng)用程序使用系統(tǒng)所要獲取的權(quán)限,比如你要向sd卡中寫入文件就要加入:

第4章 播放器系統(tǒng)功能詳細(xì)設(shè)計(jì)

4.1 播放音樂(lè)與模式

播放音樂(lè)是主要功能,它通過(guò)四大組件之一的service來(lái)實(shí)現(xiàn)的,這樣做的好處就是退出界面,音樂(lè)可以后臺(tái)播放,因此我們需要建立一個(gè)PlayService.java用來(lái)播放服務(wù)的類。在服務(wù)類中我們調(diào)用系統(tǒng)的媒體播放器android.media.MediaPlayer,在播放服務(wù)類的onCreate()方法中實(shí)例化mediaPlayer=new MediaPlayer()。然后調(diào)用它的播放,暫停,獲取當(dāng)前播放位置等等內(nèi)置方法并加以封裝修改更好的實(shí)現(xiàn)功能。

播放模式就簡(jiǎn)單了,只需自己設(shè)置幾個(gè)播放模式常量,在調(diào)用播放方法時(shí)判斷一下當(dāng)前模式,在分別調(diào)用就行了,具體實(shí)現(xiàn)代碼中有。下面是MediaPlayer的相關(guān)方法:

播放模式

private?Random random=new?Random();

@Override

public?void?onCompletion(MediaPlayer arg0) {

switch?(play_mode) {

case?ORDER_PLAY:

next();//順序播放

break;

case?RANDOM_PLAY:

play(random.nextInt(mp3Infos.size()));//隨機(jī)播放

break;

case?SINGLE_PLAY:

play(currentPosition);//單曲循環(huán)

default:

break;

}

}

由以上代碼可知android服務(wù)的調(diào)用流程,先綁定onbind()后調(diào)用,以下為綁定服務(wù)的流程:

還可以startservice()。

4.2 收藏音樂(lè)

收藏音樂(lè)看起來(lái)很高端,其實(shí)無(wú)非是把點(diǎn)擊收藏的音樂(lè)寫入sqlite數(shù)據(jù)庫(kù),當(dāng)我們點(diǎn)擊收藏的“心形”圖標(biāo)時(shí),會(huì)執(zhí)行對(duì)新建的lovemusic.db的插入數(shù)據(jù)操作,跳轉(zhuǎn)收藏頁(yè)面在調(diào)用查詢所有收藏歌曲的操作,判斷“心形”圖標(biāo)的背景顏色是否為已收藏的顯示的顏色,然后再次點(diǎn)擊會(huì)執(zhí)行刪除當(dāng)前歌曲的收藏操作。

SqliteDataBase代表一個(gè)數(shù)據(jù)庫(kù)對(duì)象,它的一些方法展示如下:

public?class?DBhelper?extends?SQLiteOpenHelper{

public?DBhelper(Context context, String name, CursorFactory factory,

int?version) {

super(context, "lovemusic.db",?null, 5);

}

@Override

public?void?onCreate(SQLiteDatabase db) {

db.execSQL("create table mymusic(id integer primary key autoincrement,"

+"title varchar(20),"+"mp3infoID varchar(20))");


}

}

PlayActivity.java部分代碼

case?R.id.love_music:

if(query(playService.getCurrentPosition())){

delete(playService.getCurrentPosition());

img_love.setImageResource(R.drawable.nokeep);

Toast.makeText(this, "取消收藏",1).show();

}else{

add(playService.getCurrentPosition(), mp3Infos.get(playService.getCurrentPosition()).getTitle());

img_love.setImageResource(R.drawable.keep);

Toast.makeText(this, "添加收藏",1).show();

}

private?void?add(int?mp3id,String mp3name) {


SQLiteDatabase db=helper.getWritableDatabase();

ContentValues values=new?ContentValues();

values.put("mp3infoID", mp3id+"");

values.put("title", mp3name);

db.insert("mymusic",?null, values);


}

private?void?delete(int?mp3id) {

SQLiteDatabase db=helper.getWritableDatabase();

db.delete("mymusic", "mp3infoID=?",?new?String[]{mp3id+""});

db.close();

}

private?boolean?query(int?mp3id) {

SQLiteDatabase db=helper.getWritableDatabase();

Cursor cursor=db.rawQuery("select * from mymusic where mp3infoID=?",

new?String[]{mp3id+""});

boolean?result=cursor.moveToNext();

cursor.close();

db.close();

return?result;

}

4.3 音樂(lè)切換時(shí)界面狀態(tài)改變

狀態(tài)改變需要調(diào)用PlayService的更新?tīng)顟B(tài)接口interface MusicUpdateListener中的onChange()方法,這個(gè)接口在基類BaseActivity中實(shí)現(xiàn),而PlayActivity繼承了這個(gè)基類,實(shí)際上所有的界面Activity都繼承了這個(gè)基類用于綁定服務(wù)等,所以在PlayActivity實(shí)現(xiàn)了onChange()方法。在onChange()把所有狀態(tài)屬性的量一一根據(jù)當(dāng)前播放的position進(jìn)行更改,實(shí)現(xiàn)了對(duì)service的監(jiān)聽(tīng)。

public?void?change(int?position) {//狀態(tài)性變量改變

Mp3Info mp3Info=mp3Infos.get(position);

setLrcView();

title.setText(mp3Info.getTitle());

end_time.setText(MediaUtils.formatTime(mp3Info.getDuration()));

if(query(playService.getCurrentPosition())){

img_love.setImageResource(R.drawable.keep);

}else?{img_love.setImageResource(R.drawable.nokeep);

}

Bitmap bm=MediaUtils.getArtwork(this,mp3Info.getId(), mp3Info.getAlbumId(),?true,?false);

img_lyric.setImageBitmap(bm);

seekBar.setProgress(0);

seekBar.setMax((int) mp3Info.getDuration());

if(playService.isplaying()){

img_play.setImageResource(R.drawable.pause);

}else?{img_play.setImageResource(R.drawable.begin);

}

switch?(playService.getPlay_mode()) {

case?PlayService.ORDER_PLAY:

menu.setImageResource(R.drawable.menu);

menu.setTag(PlayService.ORDER_PLAY);

break;

case?PlayService.RANDOM_PLAY:

menu.setImageResource(R.drawable.shuffl);

menu.setTag(PlayService.RANDOM_PLAY);

break;

case?PlayService.SINGLE_PLAY:

menu.setImageResource(R.drawable.repeat);

menu.setTag(PlayService.SINGLE_PLAY);

default:

break;

}

}

4.4 網(wǎng)絡(luò)歌曲下載

本次軟件設(shè)計(jì)采用的是百度上的音樂(lè),其實(shí)一般情況是自己在做播放器的基礎(chǔ)之上再做一個(gè)音樂(lè)后臺(tái),用來(lái)作為網(wǎng)絡(luò)請(qǐng)求。而我覺(jué)得自己做個(gè)后臺(tái)然后發(fā)出請(qǐng)求,這樣有弊端,如音樂(lè)不全面等,我這里是利用網(wǎng)絡(luò)爬蟲Jsoup對(duì)百度音樂(lè)(http://music.baidu.com/)進(jìn)行網(wǎng)頁(yè)內(nèi)容抓取,然后通過(guò)得到歌曲ID,歌名,歌手和專輯實(shí)現(xiàn)listview的顯示布局及其通過(guò)歌曲ID和歌曲URL下載音樂(lè)。

使用Handler機(jī)制實(shí)現(xiàn)方法的跳轉(zhuǎn)調(diào)用

具體實(shí)現(xiàn)代碼如下:

mp3url="musicdata.baidu.com/dat"+searchResult.getMusicId()+"/"+searchResult.getMusicId()+".mp3";

//下載歌曲

protected?void?downloadMusic(final?SearchResult searchResult,final?String url,

final?Handler handler) {

mThreadPool.execute(new?Runnable() {

@Override

public?void?run() {

File musicDirFile=new?File(Environment.getExternalStorageDirectory()+Contant.DIR_MUSIC);

if(!musicDirFile.exists()){

musicDirFile.mkdirs();

}

String mp3url=url;

System.out.println("mp3url:"+mp3url);

String target=musicDirFile+"/"+searchResult.getMusicname()+".mp3";

File filetarget=new?File(target);


if(filetarget.exists()){

handler.obtainMessage(MUSIC_EXISTS).sendToTarget();

return;

}else?{

try?{

URL url=new?URL(mp3url);

HttpURLConnection connection=(HttpURLConnection)url.openConnection();

InputStream inputStream=connection.getInputStream();

FileOutputStream fileOutputStream=new?FileOutputStream(filetarget);

byte?b[]=new?byte[1024];

int?j=0;

while((j=inputStream.read(b))!=-1){


fileOutputStream.write(b, 0, j);

}

fileOutputStream.flush();

fileOutputStream.close();

handler.obtainMessage(SUCCESS_MP3,target).sendToTarget();

}?catch?(Exception e) {

e.printStackTrace();

handler.obtainMessage(SUCCESS_MP3).sendToTarget();

}

}

}

});


}

既然說(shuō)到了網(wǎng)頁(yè)爬蟲jsoup,我還使用了它調(diào)用百度音樂(lè)的搜索引擎來(lái)獲取百度音樂(lè)的熱歌榜和按輸入的關(guān)鍵字進(jìn)行搜索;

SearchUtil的主要部分代碼:

//Jsoup請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)

private?ArrayList<SearchResult> getMusicList(final?String key,final?int?page){

final?String start=String.valueOf((page-1)*SIZE);

Document doc=Jsoup.connect(URL).data("key",key,"start",start,"size",String.valueOf(SIZE))

.userAgent(Contant.USER_AGENT).timeout(60*1000).get();

Elements songTitles=doc.select("div.song-item.clearfix");

Elements songInfos;

ArrayList<SearchResult>searchResults=new?ArrayList<SearchResult>();

TAG:

for(Element song:songTitles){

songInfos=song.getElementsByTag("a");

SearchResult searchResult=new?SearchResult();

for(Element info:songInfos){

//歌曲鏈接

if(info.attr("href").startsWith("/song")){

searchResult.setMusicname(info.text());

searchResult.setUrl(info.attr("href"));

searchResult.setMusicId(info.attr("href").substring(info.attr("href").lastIndexOf("/")+1));

System.out.println(info.attr("href").substring(info.attr("href").lastIndexOf("/")+1));

}

//歌手鏈接

if(info.attr("href").startsWith("/data")){

searchResult.setArtist(info.text());

}

//專輯鏈接

if(info.attr("href").startsWith("/album")){

searchResult.setAlbum(info.text().replaceAll("<|>",""));

}

}

searchResults.add(searchResult);

}

return?searchResults;

}

4.5 歌詞滾動(dòng)顯示

歌詞滾動(dòng)顯示主要原理就是一個(gè)滾動(dòng)的TextView控件,先通過(guò)路徑和歌名讀取歌詞文件,寫入流,然后解析歌詞格式,把歌詞前的時(shí)間作為播放某一句的時(shí)間,然后把當(dāng)前的播放的那行設(shè)為高亮等等,部分代碼如下:

LyricView.java

// 繪圖歌詞

onDraw(Canvas canvas) {

super.onDraw(canvas);

currentPaint.setColor(Color.YELLOW);

notCurrentPaint.setColor(Color.WHITE);

currentPaint.setTextSize(TEXT_SIZE); // 設(shè)置字體大小

currentPaint.setTypeface(Typeface.SERIF); // 設(shè)置字體樣式

notCurrentPaint.setTextSize(textSize);

notCurrentPaint.setTypeface(Typeface.DEFAULT);

setText("");

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.drawText(mLrcList.get(i).getLrcStr(), width / 2, tempY,

notCurrentPaint);

}

tempY = height / 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) {

//解析歌詞時(shí)間

timeStr(String timeStr)

LyricContent.java(用來(lái)存放歌詞的實(shí)體類)

歌詞部分我借鑒了網(wǎng)上的一些資料,其實(shí)在github網(wǎng)上有這樣歌詞的demo,我下載下來(lái)仿照制作了自己的歌詞顯示,由于我使用eclipse adt開(kāi)發(fā)工具無(wú)法像android studio那樣直接引入三方插件為自己所用,只能自己看資料理解它的類的使用。

結(jié) 論

通過(guò)本次畢業(yè)設(shè)計(jì),讓我對(duì)java基礎(chǔ)知識(shí)進(jìn)行了鞏固和提升,對(duì)android體系有了更加深刻的認(rèn)識(shí),對(duì)程序設(shè)計(jì)模式和面向?qū)ο缶幊趟枷肓私獾酶油笍?。下面?lái)說(shuō)說(shuō)我制作這個(gè)應(yīng)用的歷程和心得吧!

歷程:

  1. 的確,做這個(gè)東西花費(fèi)了我一個(gè)寒假的時(shí)間,起初只是實(shí)現(xiàn)了基本的播放和下一首的功能,這些書上就有介紹,界面沒(méi)有美化,光禿禿的幾個(gè)按鈕,歌曲的路徑還得自己寫,慢慢的我找到了mediaplayer這個(gè)自帶的android媒體庫(kù),可以通過(guò)它得到url,這讓我又方便了許多,起碼沒(méi)必要自己輸入歌曲路徑了。啟動(dòng)Service一個(gè)Service有兩種方法:一種是startService (Intent);另外一種是:bindService (Intent);
    第一種啟動(dòng)方式,適用于Service獨(dú)立完成任務(wù),例如說(shuō)一個(gè)下載,如果不需要暫?;蛘呷∠脑?,可以這樣來(lái)做。但是,我們這是音樂(lè)播放應(yīng)用,把MediaPlayer放在Service中執(zhí)行播放,這樣的方式很難有暫停等交互。(其實(shí)也可以這樣做,例如每次交互操作都用startService來(lái)做,通過(guò)Intent把暫停等命令出入進(jìn)去,進(jìn)度條也可以通過(guò)廣播來(lái)發(fā)送出去,但是這樣做,感覺(jué)很丑陋,肯定不是常規(guī)的高效做法);第二種啟動(dòng)方式,可以在onServiceConnected中,獲得一個(gè)Service對(duì)象(可能不是一個(gè)Service對(duì)象,至少是一個(gè)可以接觸Service內(nèi)部操作的句柄)。這樣,便可以輕松操作播放和接收進(jìn)度通知。但是這種方式有弊端,一旦與之綁定的context退出,則綁定接觸,Service也會(huì)被回收(但是不會(huì)執(zhí)行onDestory方法);那么是不是就只是簡(jiǎn)單用第二種啟動(dòng)方式?當(dāng)然不是這樣,這兩種方式并不沖突,而且十分適用于音樂(lè)播放類的應(yīng)用。

  2. 接著,我使用了listview實(shí)現(xiàn)了歌曲列表,這個(gè)比較簡(jiǎn)單,以前學(xué)過(guò)也使用過(guò);然而在tab布局時(shí)發(fā)生了奇怪的事情,TabActivity不能像往常一樣調(diào)用PlayService服務(wù),我找了很多地方,由于我開(kāi)始并不知道是TabActivity的問(wèn)題以為是PlayService在綁定服務(wù)時(shí)ServiceConnection連不上,后來(lái)才一步步排除這些可能,應(yīng)該是TabActivity的問(wèn)題,在一個(gè)微博上看到一個(gè)人的解說(shuō),它與普通的Activity有所不同:
    bindservice=this.getApplicationContext().bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE);Log.i("bind", "服務(wù)綁定");//TabActivity的問(wèn)題,bindservice要加getapplicationcontext。這個(gè)問(wèn)題讓我糾結(jié)了好幾天,我問(wèn)的好友都說(shuō)真是個(gè)奇葩的問(wèn)題,算是學(xué)習(xí)了。

  3. 接下來(lái)做的是收藏音樂(lè)的功能,主要是sqlite這塊,基本無(wú)錯(cuò),增刪查都行,另外就是調(diào)用listview把數(shù)據(jù)設(shè)置進(jìn)去就行了,就模仿本地列表就行了。

  4. 然后我發(fā)現(xiàn)一個(gè)問(wèn)題,我所做的這些操作是成功了,但設(shè)計(jì)界面時(shí),它的狀態(tài)量并沒(méi)有改變,例如我點(diǎn)擊播放后,那個(gè)播放按鈕并沒(méi)有顯示暫停圖標(biāo),收藏音樂(lè)并沒(méi)有把心形圖標(biāo)顯示為紅色,也就是狀態(tài)沒(méi)隨之改變,但收藏列表已經(jīng)添加了。接下來(lái)我就在播放服務(wù)類實(shí)現(xiàn)了監(jiān)聽(tīng),在基類實(shí)現(xiàn)調(diào)用并讓所有Activity繼承BaseActiviy以便實(shí)時(shí)改變狀態(tài),我看到教程中使用了觀察者設(shè)計(jì)模式,也設(shè)計(jì)了兩個(gè)方法,一個(gè)是publish方法,打算用于實(shí)時(shí)的變量操作,如進(jìn)度條等等;另一個(gè)change方法實(shí)現(xiàn)對(duì)狀態(tài)性變量的判斷改變操作。如收藏界面圖標(biāo)改變,播放按鈕圖片切換等等。

(5) 至此,本地的功能基本上就完成了,接著我著手制作網(wǎng)上音樂(lè)播放和下載展示。由于時(shí)間有限以及完美性要求,我直接使用百度上的音樂(lè)。這里就要隆重的介紹一個(gè)爬蟲Jsoup類了,通過(guò)網(wǎng)上關(guān)于它的使用教程,我成功的得到了百度音樂(lè)的熱歌榜單,并用同樣的listview展示出來(lái),關(guān)于音樂(lè)搜索,也是在網(wǎng)頁(yè)得到那個(gè)搜索框?qū)崿F(xiàn)了搜索功能,這樣整個(gè)百度就相當(dāng)于這個(gè)播放器的后臺(tái),搜索的音樂(lè)也越來(lái)越廣泛了。如果是自己建的后臺(tái)肯定就不能隨心所欲的搜索了。

  1. 后來(lái)是下載功能,本來(lái)下載也可以通過(guò)Jsoup獲取百度音樂(lè)的Url,后來(lái)百度做了版權(quán),把url給隱藏起來(lái),所以我曾一度迷茫,到處找下載百度音樂(lè)的鏈接,終于功夫不負(fù)有心人,在一個(gè)論壇我找到一個(gè)百度音樂(lè)的外部鏈接,測(cè)試可以使用后我修改了代碼,直接得到音樂(lè)的ID再拼接外鏈地址實(shí)現(xiàn)了下載功能。不過(guò)我想不久的將來(lái),百度也會(huì)修改外鏈,或停止外鏈,到時(shí)候就要大神去攻破難題了。具體下載就是對(duì)文件的讀寫,這個(gè)沒(méi)什么好提的。

(7) 最終章,歌詞滾動(dòng)顯示,這我真的不會(huì)動(dòng)手,百度了一個(gè)demo自己修改代碼才實(shí)現(xiàn)的;具體是先寫一個(gè)滾動(dòng)的textview,然后寫一個(gè)歌詞實(shí)體類LyricContent生成get和set方法用來(lái)存放取到的歌詞,最后寫一個(gè)讀取歌詞文件和解析歌詞文件的方法,以流的形式每隔0.1秒讀取一行,設(shè)置前行,當(dāng)前行和下一行的樣式。貌似就是這樣就能夠?qū)崿F(xiàn)歌詞的滾動(dòng)高亮顯示。具體有代碼注釋。

我的心得:

這次畢業(yè)設(shè)計(jì),我很榮幸的完成了這次任務(wù),雖然困難重重,但也收獲頗豐,總而言之,萬(wàn)事開(kāi)頭難,一件事只要你想做并動(dòng)手,其實(shí)就成功了一半,剛開(kāi)始的時(shí)候還感覺(jué)這個(gè)任務(wù)難以完成,做到后來(lái)就感覺(jué)上手了,代碼流程都弄清楚了,編寫起來(lái)就簡(jiǎn)單多了。作為一個(gè)當(dāng)代的大學(xué)生,我們要有緊迫感;同時(shí)也要有足夠的自信,這點(diǎn)我是有點(diǎn)不足,IT專業(yè)意味著我們以后能拿高薪,相對(duì)的這個(gè)IT領(lǐng)域只有技術(shù)才能立足。技術(shù)是永遠(yuǎn)在不斷的成熟,不斷地更替,尤其是IT;我主學(xué)的是java語(yǔ)言,這種語(yǔ)言才出現(xiàn)幾十年,面向?qū)ο笳Z(yǔ)言如今非常流行,這我們不用擔(dān)心會(huì)被淘汰,然而一些框架卻很容易被另外優(yōu)秀的給取代。所以無(wú)論是javaweb還是android方向,都需要精湛的java基礎(chǔ),特別是android,我曾經(jīng)看到過(guò)一些安卓游戲源碼,基本上游戲的規(guī)則等等都是java代碼寫的,而android的一些組件和UI元素只不過(guò)用來(lái)通信、跳轉(zhuǎn)以及界面美化。只有將java精通,再來(lái)深入android系統(tǒng),才能更好地寫出令人折服的程序。

另外程序設(shè)計(jì)模式是另一個(gè)組成重要部分,這個(gè)音樂(lè)播放器,我采用的是“觀察者設(shè)計(jì)模式”;將一個(gè)系統(tǒng)分割成一個(gè)一些類相互協(xié)作的類有一個(gè)不好的副作用,那就是需要維護(hù)相關(guān)對(duì)象間的一致性。我們不希望為了維持一致性而使各類緊密耦合,這樣會(huì)給維護(hù)、擴(kuò)展和重用都帶來(lái)不便。觀察者就是解決這類的耦合關(guān)系的。另外這次畢業(yè)設(shè)計(jì)我學(xué)到了”基類“這個(gè)名詞,我對(duì)它的理解就是把大部分類都具有屬性或都要用到的方法寫入基類然后繼承它,減少重復(fù)冗余的代碼,增強(qiáng)代碼的可讀性。

在這次應(yīng)用制作中我還使用到了android的一些組件,Activity就不說(shuō)了,有界面展示基本都要用到;service有一個(gè)音樂(lè)播放的服務(wù)類,其實(shí)廣播也可以辦到但那樣不符合一般播放器的理念;intent在頁(yè)面跳轉(zhuǎn)和傳參用到了,另外還有SqliteDataBase小型數(shù)據(jù)庫(kù)的CRUD操作在做收藏時(shí)也必不可少。界面UI組件的話有ListView,TextView,EditText,ImageView,SeekBar等,布局方式也用了兩種LinearLayout,RelativeLayout。這些android的東西我學(xué)過(guò)也用過(guò),但沒(méi)有把他們綜合到一個(gè)應(yīng)用里面來(lái),現(xiàn)在終于完整的開(kāi)發(fā)出一個(gè)基本功能都能實(shí)現(xiàn)的應(yīng)用了。另外這次設(shè)計(jì)我另一個(gè)巨大的收獲就是Jsoup的使用,以前就聽(tīng)說(shuō)過(guò)各種爬蟲軟件,感覺(jué)很可怕,現(xiàn)在自己用到爬蟲Jsoup就感覺(jué)更加可怕,不是它本身可怕,而是它那強(qiáng)大的功能,簡(jiǎn)直是破解網(wǎng)站信息的最佳神器。它需要引入相應(yīng)的lib包,通過(guò)document得到網(wǎng)頁(yè)信息,然后一步步根據(jù)它封裝的方法解析網(wǎng)頁(yè),從中得到有用的數(shù)據(jù),我的音樂(lè)下載鏈接就是通過(guò)它得到的。在線播放這根本不需要怎么做,我直接用一個(gè)webview就完事了,看著離成功越來(lái)越近,我做的也緩慢下來(lái),開(kāi)始進(jìn)行優(yōu)化,最終成形。

做任何事都要勇于探索,即便遇到前所未有的難題也要樂(lè)于思索,不能半途而廢,相信水滴石穿,也許井水就差你那一鋤頭就會(huì)噴涌而出。我也曾遇到過(guò)幾天也解決不了的程序難題,在不斷地調(diào)試和百度中,終于找到了問(wèn)題所在,接著解決它不就分分鐘嗎?可以想象,當(dāng)你解決成千上萬(wàn)的程序bug后,那些bug就是一份我們程序員夢(mèng)寐以求的財(cái)富。記住,IT界沒(méi)有解決不了的bug,只有解決不了bug的人。我們這個(gè)行業(yè)主要是看開(kāi)發(fā)經(jīng)驗(yàn)?zāi)陻?shù),為什么?熟能生巧,bug遇到得多了編程就沒(méi)什么問(wèn)題了。相應(yīng)的基礎(chǔ)也滾瓜爛熟,什么類,什么jar包是干什么的都知道。任何一件事情都要抱著謹(jǐn)慎的心態(tài)去做,不要因?yàn)楹?jiǎn)單而過(guò)于輕浮,也不要因?yàn)閺?fù)雜而輕易放棄。只有不斷取得進(jìn)步才能擁有做這件事的意義。另外獲取事務(wù)的途徑也要學(xué)會(huì)走正當(dāng)?shù)慕輳?,比如我們沒(méi)必要死記硬背那些幫助文檔,因?yàn)槟鞘怯脕?lái)查的,我們只需里面大概知道有哪些東西,至于具體的用法再去幫助文檔查,就像我們不需要知道計(jì)算機(jī)是怎么構(gòu)成的,我們是用戶,我們只需要會(huì)使用它就行了。但這并不是說(shuō)我們啥也不干,基礎(chǔ)還是要懂,概念還是要有;程序員做出來(lái)的軟件最終還是提供給用戶使用,所以我們必須一面和電腦打交道,一面跟用戶溝通,這就意味著我們擔(dān)任著人機(jī)交互的翻譯官。深入了解計(jì)算機(jī)和編程工具的原理,以及各種語(yǔ)言,使之能夠識(shí)別并把人們的需求意愿轉(zhuǎn)達(dá)給它,讓它幫助人們處理各種重復(fù)計(jì)算復(fù)雜的難題。計(jì)算機(jī)只識(shí)別1和0,我們用編程語(yǔ)言向計(jì)算機(jī)展示我們的意思,從而達(dá)到人機(jī)交互。

Android內(nèi)核就是基于linux系統(tǒng),雖然官方并沒(méi)有規(guī)定它專門用java編程,但實(shí)際上大都使用的就是java語(yǔ)言,它使用了jdk的大部分類,另外添加android的lib實(shí)現(xiàn)java對(duì)android組件操控,這樣就形成了一種類java語(yǔ)言。因?yàn)槲乙矔?huì)javaweb開(kāi)發(fā),感覺(jué)Android也類似于javaweb,都可以寫UI布局,可以用java操控界面組件。只是android編程需要java語(yǔ)言更加精深。

參考文獻(xiàn)

  1. 李剛.瘋狂Android講義[M]. 北京:電子工業(yè)出版社,2013:25-42.

  2. 趙亮,張維.基于Android技術(shù)的界面設(shè)計(jì)與研究[D].徐州建筑職業(yè)技術(shù)學(xué)院,2001,10(2):33-40.

  3. 劉玉平. Java輸入輸出流及在網(wǎng)站開(kāi)發(fā)中的應(yīng)用探討[J]. 郴州市科技局,2009,(18):35-49.

  4. 韓超. Android經(jīng)典應(yīng)用程序開(kāi)發(fā)[J] . 人力資源出版社,2011:5-18.

  5. 熊剛. 基于.Android的智能手機(jī)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 武漢理工大學(xué), 2010.

  6. 劉衛(wèi)國(guó),姚昱禹. Android的架構(gòu)與應(yīng)用開(kāi)發(fā)研究[J] . 中南大學(xué):信息科學(xué) 與工程學(xué)院 計(jì)算機(jī)系統(tǒng)應(yīng)用 2008-11:110-112.

  7. 靳巖,姚尚朗.Android 發(fā)入門與實(shí)踐[D].人民郵電出版補(bǔ), 2009,59

  8. 劉平. Android手機(jī)訪問(wèn)服務(wù)器的一種數(shù)據(jù)交互方法[J] . 西安財(cái)經(jīng)學(xué)院 網(wǎng)絡(luò) 與現(xiàn)在教育技術(shù)中心,2010-09:96-102.

  9. Bruce Eckel .Thinking in java(java 編程思想)第四版.北京:機(jī)械工業(yè)出版社, 2011

  10. 馬志強(qiáng).基于.Android平臺(tái)即時(shí)通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 北京交通大學(xué) 2009.

  11. 王向輝,張國(guó)印,賴明珠. Android應(yīng)用程序開(kāi)發(fā)第二版 北京:清華大學(xué)出版社數(shù)字出版網(wǎng)站2012

  12. 柯元旦. Android內(nèi)核剖析[M]. 北京:電子工業(yè)出版社, 2011:59-70.

  13. BruceEckel著 陳昊鵬 譯 .Java編程思想(第四版)機(jī)械工業(yè)出版社 2010

  14. 傳智播客高教資源研發(fā)部.android移動(dòng)應(yīng)用基礎(chǔ)教程中國(guó)鐵道出版社十二五規(guī)劃教材

  15. Xin Chen,Songwei Ma,Bingli Guo,Yan Wang,Juhao Li,Zhangyuan Chen,Yongqi He.A novel fragmentation-aware spectrum allocation algorithm in flexible bandwidth optical networks[J]. Optical Switching and Networking,2014(12):6-22.

  16. 陳璟,陳平華,李文亮. Android內(nèi)核分析[J]. 廣東工業(yè)大學(xué)計(jì)算機(jī)學(xué)院 實(shí)踐與經(jīng)驗(yàn),2009:112-115.

致 謝

本設(shè)計(jì)在文志誠(chéng)老師的悉心指導(dǎo)和嚴(yán)格考查下業(yè)已完成,從課題選擇,方案思路論證到具體設(shè)計(jì)都無(wú)不凝聚著導(dǎo)師的心血和我努力的汗水,再次表示對(duì)老師崇高的敬意。不積跬步無(wú)以至千里,不積小流無(wú)以成江海,本設(shè)計(jì)能夠完成也歸功于各位任課老師的認(rèn)真負(fù)責(zé),使我能夠很好的掌握和運(yùn)用專業(yè)知識(shí),這些在我的設(shè)計(jì)中體現(xiàn)得淋漓盡致。

兩個(gè)月的刻苦設(shè)計(jì)編寫代碼,如今終于達(dá)到預(yù)期的效果,基本功能都有了,但也有一些缺陷,前面都有提到,但在虛榮心涌上之時(shí),我又會(huì)默默安慰自己:做一件事情,不必過(guò)于在乎最終的結(jié)果,可貴的是過(guò)程中的收獲,真正的去做成一件大的正事。

四年的大學(xué)生活就快走入尾聲,這將會(huì)成為步入社會(huì)之前最后也是最值得眷戀,讓人流連忘返的一段回憶,從這里走出我們將踏上新的征程,把所學(xué)所得應(yīng)用到實(shí)際工作中去。感謝四年陪伴我的小伙伴們,希望大家以后能事事如意,工作順利。


附 錄

播放器源碼


基于android音樂(lè)播放器的設(shè)計(jì)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
久治县| 阿瓦提县| 高阳县| 杭锦后旗| 郸城县| 介休市| 隆德县| 江山市| 漾濞| 宜宾县| 佛坪县| 贵阳市| 汾西县| 丹阳市| 河池市| 达孜县| 额尔古纳市| 车致| 开封市| 托克逊县| 景东| 霞浦县| 获嘉县| 株洲市| 宜昌市| 郁南县| 北川| 区。| 屏东县| 忻州市| 凌海市| 襄汾县| 红原县| 炉霍县| 台江县| 四会市| 柘荣县| 句容市| 宝鸡市| 水富县| 潍坊市|