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

下載本文檔

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

文檔簡介

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

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

Android

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

·Dalvik虛擬機專門為移動設備做了優(yōu)化

·部集成瀏覽器該瀏覽器基于開源的WebKit引擎

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

·SQLite用作結(jié)構化的數(shù)據(jù)存儲

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

·GSM〔依賴于硬件

·藍牙Bluetooth,EDGE,3G,andWiFi〔依賴于硬件

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論