基于Android手機(jī)平臺(tái)的音樂(lè)播放器-畢業(yè)論文_第1頁(yè)
基于Android手機(jī)平臺(tái)的音樂(lè)播放器-畢業(yè)論文_第2頁(yè)
基于Android手機(jī)平臺(tái)的音樂(lè)播放器-畢業(yè)論文_第3頁(yè)
基于Android手機(jī)平臺(tái)的音樂(lè)播放器-畢業(yè)論文_第4頁(yè)
基于Android手機(jī)平臺(tái)的音樂(lè)播放器-畢業(yè)論文_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

./基于Android手機(jī)平臺(tái)的音樂(lè)播放器第一章引言-1-1.1項(xiàng)目背景-1-第2章系統(tǒng)的可行性研究-2-2.1經(jīng)濟(jì)上的可行性-2-2.2技術(shù)上的可行性-2-2.3操作上的可行性-2-第3章需求分析-3-3.1軟件目標(biāo)-3-3.2功能需求-3-功能需求<時(shí)序圖>分析和結(jié)構(gòu)圖-3-3.3系統(tǒng)性能需求-5-3.4系統(tǒng)界面需求-5-3.5運(yùn)行環(huán)境需求-6-第三章Android項(xiàng)目介紹-6-4.1什么是Android?-6-4.1.1Android簡(jiǎn)介-6-4.1.2AndroidFeatures特性-7-4.1.3Android基本框架〔AndroidArchitecture-7-4.1.4Android系統(tǒng)的四大組件-10-4.3Android常用工具的使用-11-4.3.1命令行的使用-11-4.3.2DalvikDebugMonitorService<DDMS>的使用-12-4.4Android音樂(lè)播放器的工程-12-4.4.1Android項(xiàng)目-12-4.4.2Android工程程序結(jié)構(gòu)-13-4.4.3AndroidManifest.xml文件-15-第五章播放器系統(tǒng)功能詳細(xì)設(shè)計(jì)-17-5.1音樂(lè)播放器主界面功能實(shí)現(xiàn)-17-5.1.1播放器主界面-17-5.1.2播放界面音軌的實(shí)現(xiàn)-18-5.1.3播放器播放、暫停、停止等功能-21-5.2播放列表功能-22-5.3菜單功能-24-5.3.1菜單界面-24-5.3.2菜單功能實(shí)現(xiàn)-25-5.4播放設(shè)置界面-27-5.4.1界面實(shí)現(xiàn)-27-5.4.2歌詞顯示實(shí)現(xiàn)-28-5.5.2文件瀏覽器功能實(shí)現(xiàn)-31-5.6數(shù)據(jù)存儲(chǔ)方式-31-5.6.1SharedPreferences-32-5.6.2File存儲(chǔ)方式-32-第六章結(jié)論-33-摘要 當(dāng)今社會(huì)的生活節(jié)奏越來(lái)越快+Android系統(tǒng)上一的款音樂(lè)播放器應(yīng)用程序的設(shè)計(jì)與實(shí)現(xiàn)進(jìn)行討論。Android是一個(gè)開(kāi)源的系統(tǒng),它底層是基于Linux的操作系統(tǒng),本論文的音樂(lè)播放器采用了Android開(kāi)源系統(tǒng)技術(shù),利用Java語(yǔ)言和Eclipse編輯工具對(duì)播放器進(jìn)行編寫(xiě)。同時(shí)給出了詳細(xì)的系統(tǒng)設(shè)計(jì)過(guò)程、部分界面圖及主要功能運(yùn)行流程圖,本文還對(duì)高度過(guò)程中遇到的問(wèn)題和解決方法進(jìn)行了詳細(xì)的討論,該音樂(lè)播放器集播放、暫停、停止、上一首、下一首、音量調(diào)節(jié)、歌詞顯示等功能于一體,性能良好,在Android系統(tǒng)中能獨(dú)立運(yùn)行。該播放器還擁有對(duì)手機(jī)文件瀏覽器的訪問(wèn)功能、歌曲播放模式、以及歌詞開(kāi)閉狀態(tài)的友好設(shè)置.MP3的全名是MPEGAudioLayer-3,是一種聲音文件的壓縮格式,由于本播放器只限于應(yīng)用層程序的探討,所以對(duì)具體的壓縮算法不作深究。關(guān)鍵詞:Android;開(kāi)源系統(tǒng);音樂(lè)播放器.第一章引言1.1項(xiàng)目背景 當(dāng)今社會(huì)的生活節(jié)奏越來(lái)越快,人們對(duì)手機(jī)的要求也越來(lái)越高,由于手機(jī)市場(chǎng)發(fā)展迅速,使得手機(jī)操作系統(tǒng)也出現(xiàn)了不同各類,現(xiàn)在的市場(chǎng)上主要有三個(gè)手機(jī)操作系統(tǒng),Windowsmobile,symbian,以及谷歌的Android操作系統(tǒng),其中占有開(kāi)放源代碼優(yōu)勢(shì)的Android系統(tǒng)有最大的發(fā)展前景。那么能否在手機(jī)上擁有自己編寫(xiě)的個(gè)性音樂(lè)播放器呢?能的,谷歌Android系統(tǒng)就能做到。本文的音樂(lè)播放器就是基于谷歌Android手機(jī)平臺(tái)的播放器。Android:是谷歌于20XX公布的開(kāi)放式源代碼手機(jī)系統(tǒng),它的開(kāi)放性就優(yōu)于其它封閉式的手機(jī)系統(tǒng),因此,任何人都可能根據(jù)自己的喜好將手機(jī)系統(tǒng)中的所有功能重新編寫(xiě)。這使得越來(lái)越多的人關(guān)注這個(gè)操作系統(tǒng)。本次作品音樂(lè)播放器就是基于Android平臺(tái)的。隨著計(jì)算機(jī)的廣泛運(yùn)用,手機(jī)市場(chǎng)的迅速發(fā)展,各種音頻視頻資源也在網(wǎng)上廣為流傳,這些資源看似平常,但已經(jīng)漸漸成為人們生活中必不可少的一部分了。于是各種手機(jī)播放器也緊跟著發(fā)展起來(lái),但是很多播放器一味追求外觀花哨,功能龐大,對(duì)用戶的手機(jī)造成了很多資源浪費(fèi),比如CPU,存等的占用率過(guò)高,在用戶需要多任務(wù)操作時(shí),受到了不小的影響,帶來(lái)了許多不便,而對(duì)于大多數(shù)普通用戶,許多功能用不上,形同虛設(shè)。針對(duì)以上各種弊端,選擇了開(kāi)發(fā)多語(yǔ)種的音頻視頻播放器,將各種性能優(yōu)化,繼承播放器的常用功能,滿足一般用戶〔如聽(tīng)歌,看電影的需求,除了能播放常見(jiàn)格式的語(yǔ)音視頻文件,高級(jí)功能:還能播放RMVB格式的視頻文件。此外,還能支持中文、英文等語(yǔ)言界面。

要研究了各種市場(chǎng)上流行的手機(jī)播放器,了解它們各自的插件及編碼方式,還有各種播放器播放的特別格式文件,分析各種編碼的優(yōu)缺點(diǎn)以及各種播放器本身存在的缺陷和特點(diǎn),編寫(xiě)出功能實(shí)用,使用方便快捷的播放器。目前已經(jīng)實(shí)現(xiàn)的功能有能播放常見(jiàn)音頻文件的功能,如MP3,WAV,等,擁有播放菜單,能選擇播放清單,具備一般播放器的功能,如快進(jìn),快退,音量調(diào)節(jié)等。播放模式也比較完善,有單曲,順序,循環(huán),隨機(jī)播放等模式。第2章系統(tǒng)的可行性研究當(dāng)今社會(huì)的生活節(jié)奏越來(lái)越快,人們對(duì)手機(jī)的要求也越來(lái)越高,由于手機(jī)市場(chǎng)發(fā)展迅速,是的手機(jī)操作系統(tǒng)也出現(xiàn)了不同各類,現(xiàn)在的市場(chǎng)主要有三個(gè)手機(jī)操作系統(tǒng),Windowsmobile,symbian,以及谷歌的Android操作系統(tǒng),其中占有開(kāi)發(fā)源代碼優(yōu)勢(shì)的Android系統(tǒng)有最大的發(fā)展前景。那么能否在手機(jī)上擁有自己編寫(xiě)的個(gè)性音樂(lè)播放器呢?能的,谷歌Android系統(tǒng)就能做到。本文的音樂(lè)播放器就是基于谷歌Android手機(jī)平臺(tái)的播放器。2.1經(jīng)濟(jì)上的可行性Android是Google歷經(jīng)數(shù)年和投資數(shù)億美元開(kāi)發(fā)出來(lái)的智能手機(jī)系統(tǒng),是基于Linux核的操作系統(tǒng),是Google公司在2007年11月5日公布的手機(jī)操作系統(tǒng)。隨著各大移動(dòng)終端生產(chǎn)商大力開(kāi)發(fā)和生產(chǎn)基于Android的移動(dòng)智能設(shè)備,Android迅速得到業(yè)界和社會(huì)的認(rèn)可,并成為整個(gè)產(chǎn)業(yè)的熱點(diǎn),基于Android平臺(tái)的各類人才逐漸成為各大企業(yè)競(jìng)相爭(zhēng)奪的焦點(diǎn)。而且2.2技術(shù)上的可行性Google發(fā)起了圍繞

Android

的組織——開(kāi)放手機(jī)聯(lián)盟,其英文全稱為"OpenHandsetAlliance"。它采用了軟件堆層〔softwarestack,又名以軟件疊層的架構(gòu),主要分為三部分。底層Linux核只提供基本功能;其他的應(yīng)用軟件則由各公司自行開(kāi)發(fā),部分程序以Java編寫(xiě)。2.3操作上的可行性本系統(tǒng)采用Android框架,可以在eclipse中安裝Android開(kāi)發(fā)插件,使用Android模擬器也可以使用任意Android終端。模擬器和真正的Android手機(jī)沒(méi)有太大區(qū)別,人們對(duì)手機(jī)操作早已熟悉。綜合以上三方面,該系統(tǒng)具有很高的開(kāi)發(fā)可行性,無(wú)論是從技術(shù)上經(jīng)濟(jì)上還是操作上。故此,可以設(shè)計(jì)該系統(tǒng)流程圖,建立數(shù)據(jù)字典。第3章需求分析軟件需求分析工作是軟件生存期中重要的一步,也是決定性的一步。軟件需求分析是一個(gè)不斷認(rèn)識(shí)和逐步細(xì)化的過(guò)程,該過(guò)程將軟件計(jì)劃階段所確定的軟件圍逐步細(xì)化到可詳細(xì)定義的程度。需求分析還是軟件開(kāi)發(fā)的基礎(chǔ),假定在該階段發(fā)現(xiàn)一個(gè)錯(cuò)誤,解決它需要用一小時(shí)的時(shí)間,到設(shè)計(jì)、編程、測(cè)試和維護(hù)階段解決,則要花幾倍甚至更多的時(shí)間。因此對(duì)于復(fù)雜系統(tǒng)而言,首先要進(jìn)行需求分析。開(kāi)發(fā)人員應(yīng)該對(duì)用戶的要求及現(xiàn)實(shí)環(huán)境進(jìn)行調(diào)查和了解。3.1軟件目標(biāo)本系統(tǒng)屬于用戶常用的音樂(lè)播放器??梢苑奖阌脩羝綍r(shí)對(duì)音樂(lè)文件的操作。本系統(tǒng)應(yīng)達(dá)到以下目標(biāo):〔1軟件采用人機(jī)交互的方式,界面美觀友好,操作靈活、方便、富有個(gè)性化?!?能夠?qū)σ魳?lè)文件進(jìn)行有效的管理?!?系統(tǒng)應(yīng)最大限度地實(shí)現(xiàn)易維護(hù)性和易操作性。3.2功能需求功能需求定義了開(kāi)發(fā)人員必須實(shí)現(xiàn)的軟件功能,使得用戶能完成他們的任務(wù),從而滿足了用戶的業(yè)務(wù)需求。用戶需求文檔描述了用戶使用產(chǎn)品必須要完成的任務(wù)。針對(duì)音樂(lè)播放器分別對(duì)音樂(lè)播放、在線音樂(lè)播放及會(huì)員特權(quán)的換膚等功能進(jìn)行詳細(xì)的調(diào)研和分析,總結(jié)出如下的用戶需求信息。功能需求<時(shí)序圖>分析和結(jié)構(gòu)圖從時(shí)序圖中可以看出播放器息發(fā)送和調(diào)用過(guò)程主界面主界面播放列表播放界面點(diǎn)擊進(jìn)入按鈕選擇歌曲播放進(jìn)入播放列表播放后臺(tái)serviceServic播放頁(yè)面發(fā)送參數(shù),調(diào)用后臺(tái)service播放,返回播放界面系統(tǒng)功能表和結(jié)構(gòu)圖功能類別子功能子功能播放列表播放列表菜單退出播放從擴(kuò)展卡尋找歌曲歌曲菜單播放->進(jìn)入播放界面刪除->數(shù)據(jù)庫(kù)同步更新重命名->數(shù)據(jù)庫(kù)同步更新向上、下移動(dòng)->數(shù)據(jù)庫(kù)同步更新播放界面播放播放歌曲->線程啟動(dòng)->時(shí)間更新暫停暫停歌曲->線程暫停->時(shí)間暫停停止停止歌曲->線程停止->時(shí)間停止上一首播放列表索引變化->尋找上一ID歌曲下一首播放列表索引變化->尋找下一ID歌曲播放界面菜單返回到播放列表返回到主菜單從擴(kuò)展卡尋找歌曲退出播放器隱藏播放界面主菜單退出程序程序退出進(jìn)入播放列表顯示播放列表.主界面主界面是否顯示全部音樂(lè)播放列表是否點(diǎn)擊要播放的歌曲音樂(lè)播放程序結(jié)束圖結(jié)構(gòu)圖3.3系統(tǒng)性能需求根據(jù)Android手機(jī)系統(tǒng)要求無(wú)響應(yīng)時(shí)間為5秒,所以就有如下性能要求:當(dāng)要求歌曲播放時(shí),程序響應(yīng)時(shí)間最長(zhǎng)不能超過(guò)5秒當(dāng)要求歌曲暫停時(shí),程序響應(yīng)時(shí)間最長(zhǎng)不能超過(guò)5秒當(dāng)要求歌曲上/下一首時(shí),程序響應(yīng)時(shí)間最長(zhǎng)不能超過(guò)5秒3.4系統(tǒng)界面需求播放器界面要求布局合理,顏色舒適,控制按鈕友好,為了減少開(kāi)發(fā)工程量,圖片素材多數(shù)為公司項(xiàng)目素材〔圖2.6圖2.6播放器界面說(shuō)明:左下角為清單按鈕右下角為程序退出按鈕藍(lán)色條為音軌3.5運(yùn)行環(huán)境需求操作系統(tǒng):Android手機(jī)基于LINUX操作系統(tǒng)支持環(huán)境:Android1.5-版本開(kāi)發(fā)環(huán)境:Eclipse3.5ADT0.95第三章Android項(xiàng)目介紹4.1什么是Android?4.1.1Android簡(jiǎn)介Android一詞的本義指"機(jī)器人",同時(shí)也是Google于2007年11月5日宣布的基于Linux平臺(tái)的開(kāi)源手機(jī)操作系統(tǒng)的名稱,該平臺(tái)由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成,號(hào)稱是首個(gè)為移動(dòng)終端打造的真正開(kāi)放和完整的移動(dòng)軟件。目前最好的是Android2.0的摩托羅拉DroidAndroid是基于Linux核的軟件平臺(tái)和操作系統(tǒng),早期由Google開(kāi)發(fā)〔在華注冊(cè)商標(biāo)名為"安致",后由開(kāi)放手機(jī)聯(lián)盟〔OpenHandsetAlliance開(kāi)發(fā)。它采用了軟件堆層〔softwarestack,又名以軟件疊層的架構(gòu),主要分為三部分。低層以Linux核工作為基礎(chǔ),只提供基本功能;其他的應(yīng)用軟件則由各公司自行開(kāi)發(fā),以Java作為編寫(xiě)程序的一部分。另外,為了推廣此技術(shù),Google和其它幾十個(gè)手機(jī)公司建立了開(kāi)放手機(jī)聯(lián)盟。Android在未公開(kāi)之前常被傳聞為Google或gPhone。大多傳聞?wù)J為Google開(kāi)發(fā)的是自己的手機(jī)產(chǎn)品,而不是一套軟件平臺(tái)。到了20XX1月,Google開(kāi)始發(fā)表自家品牌手機(jī)的NexusOne。目前最新SDK版本為AndroidAndroidFeatures特性Android系統(tǒng)有如下的幾大特性:·應(yīng)用程序框架支持組件的重用與替換

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

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

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

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

·多媒體支持包括常見(jiàn)的音頻、視頻和靜態(tài)印象文件格式〔如MPEG4,H.264,MP3,AAC,AMR,JPG,PNG,GIF

·GSM〔依賴于硬件

·藍(lán)牙Bluetooth,EDGE,3G,andWiFi〔依賴于硬件

·照相機(jī),GPS,指南針,和加速度計(jì)〔依賴于硬件

·豐富的開(kāi)發(fā)環(huán)境包括設(shè)備模擬器,調(diào)試工具,存及性能分析圖表,和Eclipse集成開(kāi)發(fā)環(huán)境插件4.1.3Android基本框架〔AndroidArchitecture圖4.1AndroidArchitectureApplicationsApplicationAndroid會(huì)同一個(gè)核心應(yīng)用程序包一起發(fā)布,該應(yīng)用程序包包括email客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯(lián)系人管理程序等。所有的應(yīng)用程序都是用JAVA編寫(xiě)的。<2>ApplicationFrameWork開(kāi)發(fā)者完全可以訪問(wèn)核心應(yīng)用程序所使用的API框架。該應(yīng)用程序架構(gòu)用來(lái)簡(jiǎn)化組件軟件的重用;任何一個(gè)應(yīng)用程序都可以發(fā)布它的功能塊并且任何其它的應(yīng)用程序都可以使用其所發(fā)布的功能塊〔不過(guò)得遵循框架的安全性限制。該應(yīng)用程序重用機(jī)制使得組建可以被用戶替換。所有的應(yīng)用程序都由一系列的服務(wù)和系統(tǒng)組成,包括:

·可擴(kuò)展的視圖〔Views可以用來(lái)建應(yīng)用程序,包括列表〔lists,網(wǎng)格〔grids,文本框〔textboxes,按鈕〔buttons,甚至包括一個(gè)可嵌入的web瀏覽器

·容管理器〔ContentProviders使得應(yīng)用程序可以訪問(wèn)另一個(gè)應(yīng)用程序的數(shù)據(jù)〔如聯(lián)系人數(shù)據(jù)庫(kù),或者共享它們自己的數(shù)據(jù)。

·資源管理器〔ResourceManager提供非代碼資源的訪問(wèn),如本地字符串,圖形,和分層文件〔layoutfiles。

·通知管理器〔NotificationManager使得應(yīng)用程序可以在狀態(tài)欄中顯示客戶通知信息。

·活動(dòng)類管理器〔ActivityManager用來(lái)管理應(yīng)用程序生命周期并提供常用的導(dǎo)航回退功能。<3>Libraries庫(kù)Android包括一個(gè)被Android系統(tǒng)中各種不同組件所使用的C/C++庫(kù)集。該庫(kù)通過(guò)Android應(yīng)用程序框架為開(kāi)發(fā)者提供服務(wù)。以下是一些主要的核心庫(kù):

系統(tǒng)C庫(kù)-一個(gè)從BSD繼承來(lái)的標(biāo)準(zhǔn)C系統(tǒng)函數(shù)庫(kù)〔libc,專門為基于embeddedlinux的設(shè)備定制。媒體庫(kù)-基于PacketVideoOpenCORE;該庫(kù)支持錄放,并且可以錄制許多流行的音頻視頻格式,還有靜態(tài)印像文件包括MPEG4,H.264,MP3,AAC,AMR,JPG,PNG。SurfaceManager-對(duì)顯示子系統(tǒng)的管理,并且為多個(gè)應(yīng)用程序提供2D和3D圖層的無(wú)縫融合。LibWebCore-一個(gè)最新的web瀏覽器引擎用來(lái)支持Android瀏覽器和一個(gè)可嵌入的web視圖。SGL-一個(gè)置的2D圖形引擎3Dlibraries-基于OpenGLES1.0APIs實(shí)現(xiàn);該庫(kù)可以使用硬件3D加速〔如果可用或者使用高度優(yōu)化的3D軟加速。FreeType-位圖〔bitmap和向量〔vector字體顯示。SQLite一個(gè)對(duì)于所有應(yīng)用程序可用,功能強(qiáng)勁的輕型關(guān)系型數(shù)據(jù)庫(kù)引擎。<4>AndroidRuntimeAndroid包括了一個(gè)核心庫(kù),該核心庫(kù)提供了JAVA編程語(yǔ)言核心庫(kù)的大多數(shù)功能。

每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例。Dalvik是針對(duì)于同時(shí)高效地運(yùn)行多個(gè)VMs來(lái)實(shí)現(xiàn)的。Dalvik虛擬機(jī)執(zhí)行.dex的Dalvik可執(zhí)行文件,該格式文件針對(duì)最小存使用做了優(yōu)化。該虛擬機(jī)是基于寄存器的,所有的類都經(jīng)由JAVA匯編器編譯,然后通過(guò)SDK中的dx工具轉(zhuǎn)化成.dex格式由虛擬機(jī)執(zhí)行。

Dalvik虛擬機(jī)依賴于linux的一些功能,比如線程機(jī)制和底層存管理機(jī)制。Linux核Android的核心系統(tǒng)服務(wù)依賴于Linux2.6核,如安全性,存管理,進(jìn)程管理,網(wǎng)絡(luò)協(xié)議棧和驅(qū)動(dòng)模型。Linux核也同時(shí)作為硬件和軟件堆棧之間的硬件抽象層。未來(lái)發(fā)展老牌智能手機(jī)軟件平臺(tái)制造商Symbian發(fā)言人則表示:Google的android只不過(guò)是另一個(gè)linux,symbian對(duì)其它軟件與其形成的競(jìng)爭(zhēng)并不感到擔(dān)心。除了北美之外,Symbian在其它地區(qū)智能手機(jī)市場(chǎng)都占有大部分市場(chǎng)份額。與iPhone相似,Android采用WebKit瀏覽器引擎,具備觸摸屏、高級(jí)圖形顯示和上網(wǎng)功能,用戶能夠在手機(jī)上查看電子、搜索網(wǎng)址和觀看視頻節(jié)目等,比iPhone等其他手機(jī)更強(qiáng)調(diào)搜索功能,界面更強(qiáng)大,可以說(shuō)是一種融入全部Web應(yīng)用的單一平臺(tái)。但其最震撼人心之處在于Android手機(jī)系統(tǒng)的開(kāi)放性和服務(wù)免費(fèi)。Android是一個(gè)對(duì)第三方軟件完全開(kāi)放的平臺(tái),開(kāi)發(fā)者在為其開(kāi)發(fā)程序時(shí)擁有更大的自由度,突破了iPhone等只能添加為數(shù)不多的固定軟件的枷鎖;同時(shí)與WindowsMobile、Symbian等廠商不同,Android操作系統(tǒng)免費(fèi)向開(kāi)發(fā)人員提供,這樣可節(jié)省近三成成本。Android項(xiàng)目目前正在從手機(jī)運(yùn)營(yíng)商、手機(jī)廠商、開(kāi)發(fā)者和消費(fèi)者那里獲得大力支持。谷歌移動(dòng)平臺(tái)主管安迪·魯賓<AndyRubin>表示,與軟件開(kāi)發(fā)合作伙伴的密切接觸正在進(jìn)行中。從去年11月開(kāi)始,谷歌開(kāi)始向服務(wù)提供商、芯片廠商和手機(jī)銷售商提供Android平臺(tái),并組建"開(kāi)放手機(jī)聯(lián)盟",其成員超過(guò)30家。市場(chǎng)前景Google手機(jī)于08年10月22日正式上市,與運(yùn)營(yíng)商捆綁的合約價(jià)為179美元<約合人民幣1200元>,現(xiàn)有的T-Mobile用戶可以通過(guò)網(wǎng)絡(luò)訂購(gòu)。在10月22日發(fā)布當(dāng)天,將有22個(gè)國(guó)家和地區(qū)可以買到谷歌手機(jī)。在11月,將增至27個(gè)國(guó)家和地區(qū)。谷歌手機(jī)將只能在T-Mobile網(wǎng)絡(luò)使用,將會(huì)有SIM卡鎖定限制。T-MobileUSA提供了兩種流量和短信近曝光的motosholes〔也有人稱之為mototao將搭載最新的android2.0操作系統(tǒng)包月計(jì)劃。第一檔為25美元,包括不限制的網(wǎng)絡(luò)流量,以及一定數(shù)量的短信;第二檔為35美元,包括不限制的網(wǎng)絡(luò)流量和不限數(shù)量的短信。G1支持各種谷歌的服務(wù),包括Gmail、GoogleMaps、YouTube、Google日歷和GoogleTalk,置ChromeLite瀏覽器。使用這款手機(jī)也需要Gmail賬號(hào)。"我愛(ài)死我的G1了!"谷歌聯(lián)合創(chuàng)始人拉里·佩奇<LarryPage>憧憬:"對(duì)于我來(lái)說(shuō),谷歌手機(jī)最激動(dòng)人心的一點(diǎn)就是它的未來(lái)。它的功能很強(qiáng),正如幾年前的電腦一樣。你可以上網(wǎng),安裝軟件。"T-MobileUSA為德國(guó)電信旗下移動(dòng)子公司,運(yùn)營(yíng)GSM/HSPA網(wǎng)絡(luò),擁有用戶近3000萬(wàn)。此次發(fā)布的谷歌手機(jī)采用高通MSM7201A處理器,支持7.2Mbps下載速率,美國(guó)運(yùn)營(yíng)商3G網(wǎng)絡(luò)設(shè)定的套餐速率一般可達(dá)1Mbps以上。MSM7201A為單芯片、雙核,整合硬件加速多媒體功能、支持3D圖形,300萬(wàn)像素的攝像功能可以掃描條形碼,并且有GPS功能。在美國(guó)四大移動(dòng)運(yùn)營(yíng)商中,T-MobileUSA處于相對(duì)弱勢(shì)的地位,不過(guò)T-Mobile在歐洲有更為強(qiáng)勢(shì)的是CDMAEV-DO網(wǎng)絡(luò),而T-MobileUSA和蘋果iPhone的獨(dú)家運(yùn)營(yíng)商AT&T為GSM/HSPA網(wǎng)絡(luò),后者在20XX12月就推出了全球第一個(gè)HSDPA商用服務(wù)。T-MobileUSA今年5月方才在紐約推出了3G服務(wù),目前已經(jīng)在奧斯汀、巴爾的摩、波士頓、達(dá)拉斯、休斯敦、拉斯維加斯、邁阿密、明尼阿波利斯、鳳凰城、波特蘭、圣安東尼奧和圣地亞哥等12個(gè)城市增加了3G覆蓋,公司計(jì)劃年底前將3G覆蓋的城市從目前的13個(gè)增加到27個(gè),能夠?yàn)槠涑^(guò)2/3的用戶提供3G服務(wù)。4.1.4Android系統(tǒng)的四大組件在Android系統(tǒng)中,為我們提供了四大基本組件,每個(gè)組件是一個(gè)視圖,但是有些是可見(jiàn)的,有些是不可見(jiàn)的視圖,像Activity,ContentProvider是可見(jiàn)的視圖,Service和BroadcastReceiver是不可見(jiàn)的,它們只在系統(tǒng)的后臺(tái)運(yùn)行。下面分別介紹四大組件:<1>Activity簡(jiǎn)介在Android系統(tǒng)中Activity提供可視化的用戶界面,一個(gè)Android應(yīng)用通常由多個(gè)Activity組成。多個(gè)Activity組成了Activity?!睸tack,當(dāng)前活動(dòng)的Activity處于棧頂。Activity有自己的生命周期,由Android系統(tǒng)來(lái)控制?!?Service簡(jiǎn)介顧名思義Service就是運(yùn)行在后臺(tái)的一種服務(wù)程序,一般很少和用戶交互,因此沒(méi)有可視化界面定義一個(gè)Service類比較簡(jiǎn)單,只要繼承Service類,實(shí)現(xiàn)其生命周期中的方法就可以了。一個(gè)定義好的Service必須在AndroidManifest.xml配置文件注冊(cè),通過(guò)<service>元素聲明才能使用.Service有自己的生命周期,我們可以調(diào)用startService<>啟動(dòng)一個(gè)Service或者bindService<>方法來(lái)綁定一個(gè)存在的Service〔3BroadcastReceiver簡(jiǎn)介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)BroadcastReceiver來(lái)監(jiān)聽(tīng)和響應(yīng)這些廣播的Intent〔4ContentProvider簡(jiǎn)介 ContentProvider用來(lái)保存和檢索數(shù)據(jù),并且使應(yīng)用程序之間相互訪問(wèn)數(shù)據(jù)成為可能。它是跨應(yīng)用程序共享數(shù)據(jù)的唯一方法。Android為常用的數(shù)據(jù)類型〔如:音視頻、圖片和聯(lián)系方式等提供了大量的ContentProvider。它們被定義在vider包下面。通過(guò)這樣定義好的ContentProvider我們可以方便的進(jìn)行數(shù)據(jù)操作。當(dāng)然我們必須擁有適當(dāng)?shù)臋?quán)限。我們也可以自己來(lái)定ContentProvider共享我們的數(shù)據(jù),方便用戶的訪問(wèn)4.3Android常用工具的使用命令行的使用創(chuàng)建AndroidVirtualDevices〔AVD使用androidlisttarget命令列出當(dāng)前可用的SDK版本androidcreateavd-n<name>-t<targetID>[-<option><value>]...模擬器〔Emulator的使用啟動(dòng)和停止模擬器emulator-avd<avd_name>AndroidDebugBridge<ADB>的使用查詢當(dāng)前模擬器實(shí)例數(shù)量adbdevices本地機(jī)器和模擬器之間相互拷貝文件D:\>adbpushd:\test.txt/sdcard/D:\>adbpull/sdcard/test.txtd:/安裝apk應(yīng)用程序adbpushd:\test.apk/sdcard/adbinstalltest.apk使用shell命令在DOS命令行輸入adbshell便進(jìn)入shell命令行了可以使用exit退出shellDalvikDebugMonitorService<DDMS>的使用在DOS命令窗口,輸入ddms會(huì)彈出如下圖所示界面,Android編輯工具的可視化界面<圖4.6>圖4.64.4Android音樂(lè)播放器的工程4.4.1Android項(xiàng)目Android的四大基本組件:Activity<活動(dòng)>,Service<服務(wù)>,BroadcastReceiver<廣播>,ContentProvider<容提供者>,各組件之間要進(jìn)行切換需要一個(gè)意圖或企圖Intent類,通過(guò)啟動(dòng)StartIntent<>方法來(lái)使各組件進(jìn)行跳轉(zhuǎn)Android的五大布局方式:LinearLayout<線性布局>FrameLayout<幀布局>TableLayout<表格布局>AbsoluteLayout<絕對(duì)布局>RelativeLayout<相對(duì)布局>五種布局方式可以相互嵌套,Android各種漂亮的界面都是通過(guò)嵌套布局而實(shí)現(xiàn)的。Android的線程,以及線程之間通信的中介:Handler類Android數(shù)據(jù)庫(kù):在第三章已經(jīng)介紹過(guò)了。這里不再介紹Android配置文件:AndroidManifest.Xml及res資源文件中各種屬性布局方式引用的資源等Android系統(tǒng)將插件ADT集成到了Eclipse工具上,因此,一個(gè)Android程序啟動(dòng)后,系統(tǒng)會(huì)啟動(dòng)一個(gè)模擬器〔Emulator<圖4.7,該模擬器是一款手機(jī)板的樣式,擁有手機(jī)硬件的基本操作。我們也可以將右邊的鍵盤通過(guò)代碼屬性設(shè)置將其隱藏,界面的大小可自由設(shè)定,目前最大支持800X600的分辨率。圖4.7android模擬器4.4.2Android工程程序結(jié)構(gòu)Android工程基本結(jié)構(gòu)目錄包括:src<源代碼>、gen〔Android系統(tǒng)自動(dòng)生成的常量、Res〔資源文件:主要存放程序界面的布局配置〔.xml文件和圖片資源。AndroidMainfes.xml是四大組件的驅(qū)動(dòng)配置文件,有它的存在,Android程序的四大組件才可以正常的跳轉(zhuǎn)。Android資源的類型和布局〔圖4.7圖4.7下圖-圖4.8.5為音樂(lè)播放器代碼結(jié)構(gòu)和各界面的配置文件,圖像資源等,圖4.8.1為一個(gè)Android工程所必須的結(jié)構(gòu),圖4.8.2為該播放器的.Java文件,圖4.8.3為播放器所用到的字符串,字體大小,字的顏色等配置文件,圖4.8.4為該播放器的各種界面的布局配置文件,圖4.8.5為該播放器的圖片資源。圖圖4.4.3AndroidManifest.xml文件Android系統(tǒng)的任何一個(gè)程序啟動(dòng)都需要AndroidManifest.xml來(lái)啟動(dòng)程序,任何一個(gè)新建的工程目錄都會(huì)自動(dòng)生成一個(gè)AndroidManifest.xml文件,此配置文件是整個(gè)程序能夠正常運(yùn)行的核心,它里面包含了AndroidSDK的版本,程序運(yùn)行的默認(rèn)Activity,當(dāng)程序中的任何一個(gè)組件觸發(fā)事件后,系統(tǒng)都會(huì)自動(dòng)的去AndroidManifest.xml中尋找標(biāo)識(shí)來(lái)作出相應(yīng)的操作。任何一個(gè)AndroidManifest.Xml文件的格式都應(yīng)為:<?xmlversion="1.0"encoding="utf-8"?><manifest> <application> <activity> <intent-filter> <action/><category/> </intent-filter> </activity> </application> <uses-sdk/><uses-permission/></manifest>Android系統(tǒng)有一個(gè)編碼的規(guī)定,支持的編碼是"utf-8",當(dāng)程序中出現(xiàn)亂碼是,我們須將其編碼格式轉(zhuǎn)化為"utf-8".在AndroidManifest.xml中會(huì)在第一行聲明一句:<?xmlversion="1.0"encoding="utf-8"?>。它是該系統(tǒng)支持的版本和編碼。在第二行定義了我們需要使用的架構(gòu),該架構(gòu)來(lái)自xmlns:android="schemas.android./apk/res/android"xmlns<XMLnamespace>是一個(gè)命名空間,它就像一條河的源頭一樣能讓我們找到系統(tǒng)架構(gòu),每一個(gè)配置文件必須有這個(gè)xmlns,否則程序中的所使用的所有資源將無(wú)法找到。在application元素我們定義android:icon="drawable/icon"android:label="string/app_name",android:icon是程序在手機(jī)中顯示的圖片,我們運(yùn)用drawable/icon表示了對(duì)res/drawable目錄下的icon.png的引用。string/app_name表示了對(duì)res/value目錄下string.Xml中定義的app_name參數(shù)的引用。<activityandroid:name=".PlayRackActivity"> <intent-filter> <actionandroid:name="ent.action.MAIN"/> <categoryandroid:name="ent.category.LAUNCHER"/> </intent-filter> </activity>這是系統(tǒng)確定的首先要啟動(dòng)的Activity是PlayRackActivity。在intent-filter選項(xiàng)中,有action和category等等屬性,我們需要定義action的值為ent.action.MAIN,category的值為ent.category.LAUNCHER,它們是系統(tǒng)的值,程序在解析到這些常用后就可以確定首先要啟動(dòng)的Activity。當(dāng)我們需要通過(guò)一個(gè)組件觸發(fā)另一個(gè)組件時(shí),我們將設(shè)定action和category的其它屬性值,系統(tǒng)會(huì)根據(jù)我們?cè)O(shè)定的屬性值去AndroidManifest.Xml的application中尋找標(biāo)識(shí),任何一個(gè)Activity的action和category是唯一,所以程序在任何時(shí)候都能唯一啟動(dòng)一個(gè)Activity,這樣,不同的Activity之間的跳轉(zhuǎn)就實(shí)現(xiàn)了。在AndroidManifest.Xml中有一個(gè)根結(jié)點(diǎn)<uses-sdk>,它是我們需要定義的ADT版本,例如我們將其值設(shè)定為android:minSdkVersion="4",則表示此Android工程所用的版本為1.6,Android還有1.1、1.5、1.6、2.0、2.1這幾個(gè)版本。如果我們需要對(duì)網(wǎng)絡(luò)進(jìn)行訪問(wèn),比如打開(kāi)一個(gè)網(wǎng)頁(yè),剛我還需要設(shè)置一個(gè)網(wǎng)絡(luò)訪問(wèn)權(quán)限uses-permission,將其的值設(shè)置為android:name="android.permission.INTERNET,我們就可以訪問(wèn)網(wǎng)絡(luò)了。當(dāng)然uses-permission還有很多其它的權(quán)限,例如GPS定位權(quán)限,瀏覽器數(shù)據(jù)存取權(quán)限com.android.browser.permission.READ_HISTORY_BOOKMARKS等等。當(dāng)程序的任何一個(gè)組件要用到時(shí),都必須在AndroidManifest.Xml文件中聲明。四大組件要使用前都需要聲明,其聲明方式如下:<service></service><provider></provider><activity></activity><receiver></receiver>其中聲明provider時(shí)還需要聲明其授權(quán)authorities。每個(gè)組件里面還有很多的屬性,會(huì)根據(jù)程序的具體需要定義不同的屬性。過(guò)濾器intent-filter有兩種啟動(dòng)方式來(lái)啟動(dòng)界面:<1>顯示方式顯示方式是在代碼中的直接啟動(dòng)組件,啟動(dòng)時(shí)會(huì)聲明Intent,在它的構(gòu)造方法Intent<組件1,組件2>中直接指定一個(gè)組件的名字,然后調(diào)用方法startIntent<intent>以啟動(dòng)指定的組件。隱式方式隱式方式是通過(guò)過(guò)濾器來(lái)過(guò)濾完成的,啟動(dòng)的組件必須滿足action和category的條件才能夠啟動(dòng)該組件。這些屬性是在AndroidManifest.Xml文件中聲明的。兩種啟動(dòng)方式都可以通過(guò)程序setAction〔ACTION常量和startActivity〔intent或配置文件兩種方式來(lái)實(shí)現(xiàn)組件的跳轉(zhuǎn)。第五章播放器系統(tǒng)功能詳細(xì)設(shè)計(jì)5.1音樂(lè)播放器主界面功能實(shí)現(xiàn)播放器主界面播放器主界面〔圖5.1圖5.1Android的每一個(gè)可視化界面,都有其的唯一的布局配置文件,該文件里面有各種布局方式,和各種資源文件如圖像,文字,顏色的引用,程序在運(yùn)行時(shí),可以通過(guò)代碼對(duì)各配置文件進(jìn)行讀取。這樣就可以形成不同的可視化界面和炫麗的效果。播放器主界面是一個(gè)Activity,Android工程在每個(gè)activity啟動(dòng)的時(shí)候會(huì)首先執(zhí)行Oncreate<>方法,如下代碼:Override PublicvoidonCreate<BundlesavedInstanceState>{ super.onCreate<savedInstanceState>;setContentView<R.layout.play_rack>;}該方法主要執(zhí)行界面的初始化操作,Activity有個(gè)設(shè)置布局的方法:Context.setContentView<layoutResID>,參數(shù)為資源ID,該Id在工程目錄res/layout下,主界面布局文件名為play_rack。下面為play_rack.xml布局文件代碼結(jié)構(gòu)如下:<?xmlversion="1.0"encoding="utf-8"?><AbsoluteLayout><LinearLayout></LinearLayout><SeekBar></SeekBar><LinearLayout></LinearLayout></AbsoluteLayout>在絕對(duì)布局<AbsoluteLayout>下嵌套兩種線性布局<LinearLayout>和<SeekBar>,第一個(gè)<LinearLayout>實(shí)現(xiàn)了標(biāo)題和歌曲名的顯示位置,通過(guò)<AbsoluteLayout>布局設(shè)置<LinearLayout>絕對(duì)坐標(biāo)來(lái)控制標(biāo)題的位置。每個(gè)布局可以放置多種Widget〔窗體部件例如:<TextView><ImageButton>等。每個(gè)Widget有多種屬性,可以設(shè)置該Widget的坐標(biāo),大小,背景和顏色等參數(shù)。在播放界面中,歌詞顯示為居中,實(shí)現(xiàn)方法代碼如下:<LinearLayoutandroid:orientation="horizontal"android:gravity="center"android:layout_height="wrap_content" android:layout_width="fill_parent"> <TextViewandroid:layout_height="wrap_content" android:textColor="#8deeee"android:id="+id/lrcText" android:layout_width="wrap_content"></TextView></LinearLayout>屬性:orientation="horizontal":此線性布局的子部件為水平方式布局 Layout_width="fill_content":布局的寬度為填滿父布局Layout_height="wrap_content":布局的高度子由窗體的大小決定窗體TextView文本:textColor="8deeee"設(shè)置文本顯示的顏色RGB為"8deeee"TextSize為默認(rèn)大小播放界面音軌的實(shí)現(xiàn)播放器音軌SeekBar〔如下圖Android系統(tǒng)自帶SeekBar〔如下圖圖5.2不管是從界面外觀還是從功能上,系統(tǒng)自帶的SeekBar往往不能滿足用戶的需要。所以我在這里自定義了一個(gè)音軌SeekBar,在play_rack.Xml配置文件中,SeekBar的代碼如下:<SeekBarandroid:id="+id/seekbar"android:layout_width="245px" android:layout_height="20px"android:layout_x="40px"android:layout_y="260px" android:progressDrawable="drawable/seekbar_style"android:thumb="drawable/thumb" android:paddingLeft="18px"android:paddingRight="15px"android:paddingTop="5px"android:paddingBottom="5px"android:progress="0"android:max="100"android:secondaryProgress="0"></SeekBar>上面代碼中有參數(shù)android:thumb="drawable/thumb"為音軌游標(biāo)的圖片資源android:progressDrawable="drawable/seekbar_style"為SeekBar條的風(fēng)格style。引用了drawable中的seekbay_style.xml文件,seekbay_style.Xml是自定義的配置文件,算法如下:<?xmlversion="1.0"encoding="utf-8"?><layer-listxmlns:android="schemas.android./apk/res/android"><itemandroid:id="android:id/background"><shape><cornersandroid:radius="5dip"/><gradientandroid:startColor="#ff9d9e9d"android:centerColor="#ff5a5d5a"android:centerY="0.75"android:endColor="#ff747674"android:angle="270"/></shape></item><itemandroid:id="android:id/secondaryProgress"> <clip><shape><cornersandroid:radius="5dip"/><gradientandroid:startColor="#80ffd300"android:centerColor="#80ffb600"android:centerY="0.75"android:endColor="#a0ffcb00"android:angle="270"/></shape></clip></item><itemandroid:id="android:id/progress"><clip><shape><cornersandroid:radius="5dip"/><gradientandroid:startColor="#ff0099CC"android:centerColor="#ff3399CC"android:centerY="0.75"android:endColor="#ff6699CC"android:angle="270"/></shape></clip></item></layer-list>配置文件中三個(gè)Item項(xiàng)依次決定了SeekBar的三層背景,從最下層的灰色到最上層的藍(lán)色。通過(guò)各種屬性設(shè)置了SeekBar的傾斜度,兩端圓半徑,角度,中心位置,起始,中心和結(jié)束的顏色,游標(biāo)的起始位置。通過(guò)這些屬性設(shè)置,就自定義一個(gè)如上圖一的SeekBar音軌.播放器最重要的一部分就是音軌與歌曲進(jìn)度同步的實(shí)現(xiàn)。音軌設(shè)置了兩個(gè)TextView用來(lái)顯示當(dāng)前歌曲播放的進(jìn)度時(shí)間和歌曲的長(zhǎng)度<圖5.3>圖5.3音軌對(duì)象SeekBar在歌曲剛開(kāi)始播放的時(shí)候調(diào)用方法SeekBar.setMax<>,參數(shù)傳入歌曲的長(zhǎng)度。SeekBar.setProgress<1>設(shè)置游標(biāo)的起始進(jìn)度為1。然后程序運(yùn)行如下代碼:privateRunnablethread_One=newRunnable<>{//線程publicvoidrun<>{intcurrently_Progress=seekBar.getProgress<>+1000; seekBar.setProgress<currently_Progress>; currently_Time.setText<getFileTime<mplayer.getCurrentPosition<>>>; showLrcTwo<lrc_time,lrc_word>;handler.postDelayed<thread_One,1000>;}};Android的線程的開(kāi)始是通過(guò)Handler類來(lái)進(jìn)行的,Handler類是線程與線程之間通信的橋梁,實(shí)現(xiàn)Runnable接口會(huì)實(shí)現(xiàn)里面的run方法,當(dāng)線程開(kāi)始的時(shí)候,Runnable中的run方法會(huì)向Handler發(fā)一個(gè)Message消息,這樣,Handler類就可以接收到run方法發(fā)送過(guò)來(lái)的不同的消息進(jìn)行不同的代碼處理。這樣就達(dá)到了各線程之間的通信。要啟動(dòng)一個(gè)線程調(diào)用Handler的方法postDelayed〔Runnable,1000表示線程睡眠時(shí)間是1000ms。以上代碼意思是讓播放歌曲的線程每隔1000ms,即每1秒對(duì)音軌的TextView重新設(shè)置時(shí)間且讓進(jìn)度條前進(jìn)1秒的進(jìn)度。對(duì)音軌進(jìn)行刷新。這樣就實(shí)現(xiàn)了歌詞同步功能SeekBar有一個(gè)監(jiān)聽(tīng)器,該監(jiān)聽(tīng)器的作用是一直保持著對(duì)進(jìn)度條的監(jiān)聽(tīng),當(dāng)我們用鼠標(biāo)向SeekBar的各位置進(jìn)行點(diǎn)擊時(shí),它會(huì)自動(dòng)監(jiān)聽(tīng)其位置,進(jìn)行相應(yīng)的位置顯示。這也是進(jìn)度條上的游標(biāo)會(huì)不停的移動(dòng)和歌詞時(shí)間會(huì)不停的變動(dòng)的原因。播放器播放、暫停、停止等功能圖5.4如圖5.4所示:各按鈕水平放置,用的是布局中的線性布局LinearLayout,用方法setOrientation<horizontal>;將其設(shè)置為水平。LinearLayout中依次放置播放,暫停,停止,上、下一曲按鈕屬性。配置文件代碼結(jié)構(gòu)如下:<LinearLayout> <ImageButton></ImageButton> <ImageButton></ImageButton> <ImageButton></ImageButton> <ImageButton></ImageButton> <ImageButton></ImageButton></LinearLayout>android的媒體播放原理:android源程序已經(jīng)為我們封裝好了一個(gè)接口類,叫MediaPlayer。該接口在執(zhí)行行需要一個(gè)數(shù)據(jù)源,通過(guò)如下四個(gè)步驟:第一步:MediaPlayer.reset<>;復(fù)位操作,為以后的媒體準(zhǔn)備播放作準(zhǔn)備。 第二步:傳入歌曲數(shù)據(jù)源,這里也是一個(gè)數(shù)據(jù)流MediaPlayer.setDataSource<Stringpath>;參數(shù)需要傳一個(gè)路徑,該接口類在收到路徑后將其轉(zhuǎn)化為數(shù)據(jù)源。第三步:準(zhǔn)備播放數(shù)據(jù)源,調(diào)用方法MediaPlayer.Prepare<>;第四步:MediaPlayer.Start<>;播放數(shù)據(jù)源,該數(shù)據(jù)源播放后,不再與程序有關(guān),需要用MediaPlayer.Stop<>方法讓其停止或MediaPlayer.Start<>;讓其啟動(dòng);歌曲數(shù)據(jù)源的獲得:要獲得數(shù)據(jù)源,需要我們提供給接口類一個(gè)歌曲存放路徑,而這個(gè)路徑已經(jīng)被事先放到數(shù)據(jù)庫(kù)里了,我們只需要進(jìn)行數(shù)據(jù)庫(kù)進(jìn)行操作。將里面的路徑取出。這里將調(diào)用PlayRackActivity的一個(gè)方法query<>;代碼算法如下:publicStringquery<>{ ContentResolvercr=getContentResolver<>; Uriuri=DBProvider.CONTENT_URI; String[]projection={"path"}; Stringselection="fileName=?"; String[]selectionArgs={selectName}; Cursorc=cr.query<uri,projection,selection,selectionArgs,null>; if<c.moveToFirst<>>{ Stringpath=c.getString<0>; returnpath; }returnnull;}方法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è)Uri。Uri類似一個(gè)網(wǎng)絡(luò)連接的Url。Uri是數(shù)據(jù)庫(kù)唯一的標(biāo)識(shí),不同的Uri可以操作不同的數(shù)據(jù)庫(kù)表。在查詢數(shù)據(jù)庫(kù)時(shí)需要傳入一個(gè)當(dāng)前播放的歌曲名字,通過(guò)歌曲名字來(lái)查詢歌曲的路徑。5.2播放列表功能播放列表界面〔如圖5.5圖5.5布局層次關(guān)系如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayout><LinearLayout> <TextView></TextView></LinearLayout> <ListView></ListView><LinearLayout> <ImageButton></ImageButton> </LinearLayout></LinearLayout>在Android里面,有一個(gè)視圖叫ListView,其特點(diǎn)是一個(gè)有BaseAdapter的屬性,從下到下,或從左到右的顯示方式。系統(tǒng)默認(rèn)的方式每一行只顯示一個(gè)TextView,本播放列表實(shí)現(xiàn)了自定義的方式,剛ListView的每一行顯示一個(gè)音樂(lè)圖片和一個(gè)歌曲名字。我們定義一個(gè)類MusicAdapter繼承了BaseAdapter,然后通過(guò)算法對(duì)這個(gè)適配器進(jìn)行擴(kuò)展,擴(kuò)展成為第一行能顯示一圖片和一個(gè)歌曲名字。由于BaseAdapter是一個(gè)抽象類,我們需要實(shí)現(xiàn)里面的抽象方法getView〔。該方法返回一個(gè)View,即視圖。視圖可以顯示在Activity上,所以就可以看到我們想要的歌曲列表界面。ListView同樣有一個(gè)監(jiān)聽(tīng)器newonItemClickListener<>{OverridepublicvoidonItemClick<AdapterView<?>arg0,Viewarg1,intarg2,longarg3>{}},我們只要實(shí)現(xiàn)這個(gè)方法,就可以監(jiān)聽(tīng)鼠標(biāo)的點(diǎn)擊事件,當(dāng)鼠標(biāo)點(diǎn)擊到每一行時(shí),可以通過(guò)ListView.getItemAtPositon<intposition>得到該行上的信息。這樣就可以通過(guò)Intent將數(shù)據(jù)傳入到其它的Activity。本程序的思路是當(dāng)鼠標(biāo)點(diǎn)擊一行,會(huì)跳轉(zhuǎn)到另一個(gè)Activity里面,這個(gè)Activity和歌曲列表類似,也是一個(gè)ListView,該界面將在下一節(jié)介紹。 歌曲列表是從播放主界面跳轉(zhuǎn)過(guò)來(lái)的,能跳到該歌曲列表是前提是數(shù)據(jù)有歌曲列表的存在。因?yàn)槊看胃枨斜盹@示時(shí)會(huì)查詢數(shù)據(jù)庫(kù)中的歌曲列表。如果不存在剛會(huì)提示是空列表,選擇到SDCard中添加歌曲<如圖5.6>圖5.6中間為一個(gè)Dialog對(duì)話框,具有Acitivty的屬性,但是獨(dú)立于界面的一個(gè)視圖,該對(duì)話框中放置了一個(gè)布局文件。Dialog的創(chuàng)建:AlertDialog.Builder,AlertDialogalert=builder.create<>;alert.show<>;該Dialog上有兩個(gè)菜單選項(xiàng),第一個(gè)為"從SD卡",點(diǎn)擊會(huì)跳轉(zhuǎn)到SDcard界面中。5.3菜單功能菜單界面〔如圖5.7圖5.7菜單界面在Menu.Xml配置文件中,布局結(jié)構(gòu)如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayout><LinearLayout><TextView></TextView></LinearLayout> <ListView></ListView><TextView></TextView><LinearLayout> <ImageButton></ImageButton> </LinearLayout></LinearLayout>在程序中的Menu.Java中有List<String>容器,該容器可以存放String類型的字符,如下:List<String>seclect_items=newArrayList<String><>;seclect_items.add<"播放">; seclect_items.add<"詳細(xì)">; seclect_items.add<"新增">; seclect_items.add<"移除">; seclect_items.add<"全部移除">; seclect_items.add<"設(shè)置">;然后通過(guò)ListView.setAdapter<>;方法將這些參數(shù)設(shè)置到界面中去,可以看到與界面顯示效果相同!該菜單每一行有一圖片和一個(gè)菜單選項(xiàng)〔如圖5.8圖5.8ListAdapter繼承一個(gè)BaseAdapter,實(shí)現(xiàn)里面的getView〔方法,再對(duì)其進(jìn)行擴(kuò)展。ViewgetView<intposition,ViewconvertView,ViewGroupparent>{ convertView=inflater.inflate<R.layout.file_row,null>;holder.text=<TextView>convertView.findViewById<R.id.text>;holder.icon=<ImageView>convertView.findViewById<R.id.image_Icon>; convertView.setTag<holder>;}ListAdapter每一行都是一個(gè)LineaLayout布局,水平放置一個(gè)圖片一個(gè)String。這種算法的實(shí)現(xiàn)在前面已經(jīng)討論過(guò),這里不再討論。菜單功能實(shí)現(xiàn)菜單有6個(gè)功能:播放,詳細(xì),新增,移除,全部移除,設(shè)置。各功能都是通過(guò)鼠標(biāo)點(diǎn)擊或觸屏觸發(fā)事件。播放功能:點(diǎn)擊后事件觸發(fā),傳入歌曲名字,讓程序操作該名字進(jìn)行播放。詳細(xì)功能:點(diǎn)擊后事件觸發(fā),傳入歌曲名字,跳轉(zhuǎn)到下一界面,顯示該歌曲的詳細(xì)信息。新增功能:點(diǎn)擊后事件觸發(fā),進(jìn)入到SDCard中,進(jìn)行歌曲添加選擇。移除功能:點(diǎn)擊后事件觸發(fā)。從數(shù)據(jù)庫(kù)中刪除選中的歌曲。全部移除:點(diǎn)擊后事件觸發(fā),刪除播放列表。設(shè)置功能:點(diǎn)擊后事件觸發(fā),進(jìn)入到播放設(shè)置列表。選擇移除菜單選項(xiàng)時(shí),出現(xiàn)〔圖的Dialog、選擇全部移除菜單選項(xiàng)時(shí),出現(xiàn)〔圖5.9.2的Dialog圖刪除單首歌曲算法:是對(duì)數(shù)據(jù)庫(kù)進(jìn)行單項(xiàng)操作。通過(guò)歌曲名字刪歌曲,算法如下:del_One<StringmusicName>{ContentResolvercr=getContentResolver<>;Uriuri=DBProvider.CONTENT_URI; Stringwhere="fileName=?"; String[]selectionArgs={musicName}; cr.delete<uri,where,selectionArgs>; }選擇"是"后,執(zhí)行代碼:Intentintent=newIntent<Menu.this,PlayListActivity.class>; startActivity<intent>;聲明一個(gè)Intent,并指明要跳轉(zhuǎn)的界面類,然后啟動(dòng)Intent。5.4播放設(shè)置界面界面實(shí)現(xiàn)圖5.10配置文件setting.Xml布局結(jié)構(gòu)如下:<?xmlversion="1.0"encoding="utf-8"?> <LinearLayout> <RadioGroup> <RadioButton></RadioButton> <RadioButton></RadioButton> <RadioButton></RadioButton> </RadioGroup> </LinearLayout><ToggleButton/><AbsoluteLayout> <ImageButton/> <ImageButton/> </AbsoluteLayout>最外層的LinearLayout里面嵌套多層LineaLayout,子LinearLayout里面嵌套著單選按鈕RatioGroup和開(kāi)關(guān)按鈕ToggleButton。RatioGroup里面嵌套著3個(gè)RatioButton,即界面上顯示的〔單曲循環(huán)、隨機(jī)播放、順序播放。<1>播放模式用的是一個(gè)組件RadioGroup,這個(gè)組件有單項(xiàng)選擇的功能,里面有RadioButton項(xiàng),多個(gè)RadioButton項(xiàng)只能同時(shí)選中一個(gè),該播放器播放模式有單曲循環(huán),隨機(jī)播放,順序播放等功能。MediaPlayer有一個(gè)監(jiān)聽(tīng)器,它監(jiān)聽(tīng)著歌曲是否正在播放或者是否播放完成,當(dāng)歌曲播放完成時(shí),會(huì)觸發(fā)方法OnCompletionListener<>,在該方法里面可以處理歌曲播放完成后的操作。RadioGroup可以進(jìn)行單項(xiàng)選擇操作,如圖<5.11>圖5.11通過(guò)RadioButton.isChecked<>,如果返回true,剛該項(xiàng)被選中。<2>歌詞設(shè)置歌詞是否顯示是一個(gè)開(kāi)關(guān)按鈕ToggleButton實(shí)現(xiàn)的,有ON和OFF狀態(tài),當(dāng)為ON時(shí),歌詞顯示,為OFF時(shí),歌詞關(guān)閉。如圖<5.12>:圖5.12ToogleButton同樣有一個(gè)監(jiān)聽(tīng)器,可以獲得ToogleButton的不同狀態(tài)。使用前對(duì)它進(jìn)行實(shí)例化<ToggleButton>View.findViewById<R.id.ly_lrc>;并且用ToggleButton.isChecked<>;獲得開(kāi)關(guān)狀態(tài)。播放模式狀態(tài)和歌詞顯示狀態(tài)的操作結(jié)果都將以一個(gè)標(biāo)志,被寫(xiě)在一個(gè)配置文件中,這是關(guān)于Android的存儲(chǔ)方式,將在后面主要介紹。歌詞顯示實(shí)現(xiàn)本播放器以歌詞格式.Lrc的文件。我們查看.Lrc文件中的歌詞格式為:[00:16.18]呼吸著你的香水味即是以"時(shí)間+歌詞"的格式存儲(chǔ)。下面將介紹如何將.Lrc中的歌詞讀取出來(lái)并存儲(chǔ)在Android的配文件中<1>.xml配置文件的存儲(chǔ)Android系統(tǒng)目錄結(jié)構(gòu)如下圖:圖5.13我們可以看到一個(gè)目錄為sdcard,該目錄即為擴(kuò)展卡,里面預(yù)先存放著音頻文件和.Lrc歌詞文件,我們定義一個(gè)BufferedReaderbuffer=newBufferedReader<newFileReader<newFile<"/sdcard/"+musicName+".lrc">>>;指定.Lrc文件存在的路徑,并將文件讀取到BufferReader中。由于我們要分別存放時(shí)間和歌詞,所以我們應(yīng)該定義兩個(gè)List<String>容器來(lái)存放時(shí)間和歌詞。在讀取lrc時(shí),每次讀取一行,再用算法將時(shí)間和歌詞分開(kāi)后放到一個(gè)數(shù)組里面,并分別存放在兩個(gè)list中。由于歌曲在播放時(shí)會(huì)存在界面之間的跳轉(zhuǎn),所以歌詞必須固定存放在一個(gè)文件中,而不能作為一個(gè)對(duì)象,因此,我們將兩個(gè)時(shí)間List和歌詞List再寫(xiě)進(jìn)一個(gè)配置文件中.Android提供給我們一個(gè)共享文件的類SharedPreferences。它有一個(gè)方法getSharedPreferences<參數(shù)1,參數(shù)2>,參數(shù)1為寫(xiě)進(jìn)時(shí)的標(biāo)記,便于在從其中讀取出來(lái)時(shí)的標(biāo)記,參數(shù)2為讀取模式,有只寫(xiě)模式〔MODE_WORLD_WRITEABLE和只讀模式〔MODE_WORLD_READABLE,在寫(xiě)之前將其置入編輯狀態(tài),用靜態(tài)方法SharedPreferences.Editoreditor=sp.edit<>;然后對(duì)象editor可以存入一個(gè)HashMap<key,values>類型的鍵值,即putString<KEY,VALUES>,這樣,我們可以將List中的對(duì)象轉(zhuǎn)化成一樣長(zhǎng)的字符中放進(jìn)配置文件中.當(dāng)寫(xiě)入成功時(shí),android系統(tǒng)會(huì)自動(dòng)在目錄data/data/工程包名/shared_prefs/目錄下生成一個(gè)配置文件如<圖5.14>圖5.14打開(kāi)播放模式的配置文件.xml,文件中是以map的形式存儲(chǔ)。鍵名<stringname="random_Play"></string>,而它的值是is_Radom。如下圖:<2>.xml配置文件的讀取

我們?nèi)砸圆シ拍J阶x取為例:當(dāng)需要用到播放模式的確定時(shí),我們將讀取.Xml文件,同樣用共享文件類SharedPreferences通過(guò)用方法getSharedPreferences<"SET_MSG",MODE_WORLD_READABLE>,并且是只讀方式獲得.Xml的文件容。SharedPreferences的對(duì)象調(diào)用方法getString<"sigle_Play",null>,方法返回一個(gè)String類型的值,即是我們以前存儲(chǔ)進(jìn)去的String值。此方法當(dāng)該標(biāo)記不存在時(shí)會(huì)默認(rèn)返回一個(gè)null值。獲得成功后我們就可以運(yùn)用當(dāng)前的值再對(duì)程序進(jìn)行操作了。文件瀏覽器界面布局格式類似上面介紹的菜單,只是在界面的第一行新增了一個(gè)返回根目錄的功能。由于程序只關(guān)系到目錄/sdcard的目錄下的文件,所以用程序屏蔽了其它的目錄,這里只顯示兩個(gè)目錄/sdcard和/system。播放器只需要用到媒體文件,所以代碼也屏蔽了其它文件的子目錄。當(dāng)選中sdcard會(huì)進(jìn)入到圖5.16,該目錄下只顯示媒體文件,如.Mp3,和sdcard下的子目錄。選中system會(huì)進(jìn)入到圖5.17,該目錄會(huì)顯示system下的各級(jí)子目錄。當(dāng)有媒體文件時(shí)才會(huì)出現(xiàn)添加Dialog。當(dāng)要添加選中的歌曲時(shí),程序有自動(dòng)判斷功能,首先彈出Dialog〔圖5.18。點(diǎn)擊確定按鈕后,程序會(huì)查詢數(shù)據(jù)庫(kù)中的歌曲,調(diào)用方法query<fileName>,根據(jù)歌曲名字查詢,如果歌曲不存在,則調(diào)用方法insertMusic<file>,如果該歌曲名字已經(jīng)存在,則彈出Dialog對(duì)話框〔圖5.19,當(dāng)添加成功后,程序會(huì)跳轉(zhuǎn)到播放列表中以顯示添加結(jié)果。圖5.18圖5.19文件瀏覽器功能實(shí)現(xiàn)程序中,文件瀏覽器類為FileExplorerActivity繼承了ListActivity,此Activity是一個(gè)ListView界面。整個(gè)界面是一個(gè)ListView布局,而每一行是一個(gè)LinearLayout水平方式布局,上面將放置一個(gè)圖片和一個(gè)文件全路徑。該文件全路徑被存放到數(shù)據(jù)庫(kù)中,以便歌曲播放能查詢到歌曲路徑源<圖5.20>圖5.20該ListView實(shí)現(xiàn)了自動(dòng)判斷的功能,即程序可以通過(guò)訪問(wèn)擴(kuò)展卡中的文件屬性而自動(dòng)識(shí)別文件屬性。如上圖所示:當(dāng)為一個(gè)Mp3格式文件時(shí),則前面圖標(biāo)顯示mp3圖標(biāo),當(dāng)為一個(gè)文件目錄時(shí),則圖標(biāo)標(biāo)識(shí)為一個(gè)文件。文件瀏覽器是用遞歸算法實(shí)現(xiàn)的,方法fillWithRoot<>是返回根目錄的列表。fill<File[]files>返回子路徑列表。算法如下: items=newArrayList<String><>; items.add<getString<R.string.to_top>>; for<Filefile:files>{ if<file.isDirectory<>>{ if<<file.getPath<>.indexOf<"/sdcard">>!=-1 ||<file.getPath<>.indexOf<"/system">>!=-1> items.add<file.getPath<>>;} if<<file.getPath<>.indexOf<".mp3">>!=-1||〔file.getPath<>.indexOf<".wav">!=-1>{ items.add<file.getPath<>>; }}//將文件路徑顯示在界面中 setListAdapter<newMusicAdapter<this,items>>;本程序只讓顯示.Mp3和.Wav格式的媒體文件。5.6數(shù)據(jù)存儲(chǔ)方式在播放器正常運(yùn)行時(shí),由于各界面存在相互跳轉(zhuǎn),為了避免數(shù)據(jù)在界面跳轉(zhuǎn)的過(guò)程中丟失,我們需要將一些數(shù)據(jù)進(jìn)行臨時(shí)存儲(chǔ)或者永久存儲(chǔ)。保存數(shù)據(jù)Android作為一種手機(jī)操作系統(tǒng),提供了如下幾種存取數(shù)據(jù)的方式:Preference〔配置、File〔文件、SQLite數(shù)據(jù)和網(wǎng)絡(luò)。保存數(shù)據(jù)另外,在Android中各個(gè)應(yīng)用程序組件之間是相互獨(dú)立的,彼此的數(shù)據(jù)不能共享。為了實(shí)現(xiàn)數(shù)據(jù)的共享,Android提供了ContentProvider組件來(lái)實(shí)現(xiàn)應(yīng)用程序之間數(shù)據(jù)的共享SharedPreferencesPreferencePreference提供了一種輕量級(jí)的數(shù)據(jù)存取方法,一般數(shù)據(jù)比較少,一些簡(jiǎn)單的配置信息。它以"鍵-值"〔是一個(gè)Map對(duì)的方式,將數(shù)據(jù)保存在一個(gè)XML配置文件中

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論