200602044011_張浩_第1頁
200602044011_張浩_第2頁
200602044011_張浩_第3頁
200602044011_張浩_第4頁
200602044011_張浩_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、單位代碼 10642 密 級(jí) 公開 學(xué) 號(hào)200602044011重慶文理學(xué)院學(xué)士學(xué)位論文 基于Android平臺(tái)多媒體播放器的設(shè)計(jì)與實(shí)現(xiàn) 論文作者: 張 浩指導(dǎo)教師: 王瑞胡學(xué)科專業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) | 計(jì)算機(jī)科學(xué)與技術(shù)提交論文日期: 年 月 日 論文答辯日期: 年 月 日 學(xué)位授予單位:重慶文理學(xué)院 中 國 重 慶2010年4月計(jì)算機(jī)學(xué)院畢業(yè)論文(設(shè)計(jì)) 目錄目 錄1 Android體系結(jié)構(gòu)分析11.1 引言11.2 Android體系結(jié)構(gòu)介紹11.2.1應(yīng)用程序11.2.2應(yīng)用程序框架11.2.3庫和運(yùn)行環(huán)境11.3 Android應(yīng)用程序組成21.3.1 Activity介紹21.

2、3.2 Broadcast Intent Receiver介紹21.3.3 Service介紹31.3.4 Content Provider介紹31.4 Android應(yīng)用工程文件組成32 基于Android多媒體播放器設(shè)計(jì)52.1 多媒體播放器功能設(shè)計(jì)52.2 播放器詳細(xì)設(shè)計(jì)52.2.1 多媒體播放器應(yīng)用名稱52.2.2多媒體播放器應(yīng)用圖標(biāo)52.2.3播放列表設(shè)計(jì)52.2.4視頻播放的設(shè)計(jì)72.2.5音樂播放的設(shè)計(jì)83 設(shè)計(jì)作品展示133.1作品截圖展示133.1.1載有Android的模擬器133.1.2音樂和視頻選擇界面143.1.3播放列表143.1.4音樂播放界面153.1.5后臺(tái)播

3、放音樂中163.1.6視頻播放界面16I2006級(jí) 張 浩 畢業(yè)設(shè)計(jì) 基于Android平臺(tái)多媒體播放器設(shè)計(jì)與實(shí)現(xiàn)計(jì)算機(jī)科學(xué)與技術(shù) 張 浩 指導(dǎo)教師 王瑞胡摘要: 播放多媒體的時(shí)候用戶啟動(dòng)了其他Activity,這個(gè)時(shí)候程序要在后臺(tái)繼續(xù)播放;如檢測(cè)SD卡上文件的變化;或者在后臺(tái)記錄用戶的地理信息位置的改變等。此時(shí)則需要用到Android提供的Service,可以通過Activity來啟動(dòng)一個(gè)Service,系統(tǒng)也將保持這個(gè)Service一直運(yùn)行。然后我們就可以把播放程序放到Service里面運(yùn)行了,然后通過Activity來調(diào)用Service內(nèi)控制MediaPlayer的方法來控制播放器,其中

4、傳遞參數(shù)由Intent進(jìn)行。關(guān)鍵詞: Android;多媒體;Intent;Activity;ServiceIIIAndroid platform media player based on the design and implementation -Android platform on the Analysis and DesignMajor: Computer Science and Technology Class: 1 Author: Zhang Hao Supervisor: Wang RuihuAbstract:When a user starts playing multim

5、edia other Activity, this time program to continue playing in the background; such as detecting changes in files on SD cards; or in the background and record the location of the users geographic information and changes. At this point you need to use Android to provide the Service, through the Activi

6、ty to start a Service, the system will remain the Service has been run. Then we can put the player inside the running of the Service, and then to call the Service Activity MediaPlayer within the control method to control the player, including passing parameters by the Intent toKeywords:Android ; Mul

7、timedia ;Intent;Activity;Service 1 Android體系結(jié)構(gòu)分析1.1 引言Android是基于Linux內(nèi)核的軟件平臺(tái)和操作系統(tǒng),早期由Google開發(fā),后由開放手機(jī)聯(lián)盟Open Handset Alliance)開發(fā)。它采用了軟件堆層(software stack,又名以軟件疊層)的架構(gòu),主要分為三部分。低層以Linux內(nèi)核工作為基礎(chǔ),只提供基本功能;其他的應(yīng)用軟件則由各公司自行開發(fā),以Java作為編寫程序的一部分。另外,為了推廣此技術(shù),Google和其它幾十個(gè)手機(jī)公司建立了開放手機(jī)聯(lián)盟。Android在未公開之前常被傳聞為Google電話或GPhone。大

8、多傳聞?wù)J為Google開發(fā)的是自己的手機(jī)電話產(chǎn)品,而不是一套軟件平臺(tái)。到了2010年1月,Google開始發(fā)表自家品牌手機(jī)電話的Nexus One。目前最好的是Android3.0。1.2 Android體系結(jié)構(gòu)介紹1.2.1應(yīng)用程序Android的應(yīng)用程序通常涉及用戶界面和用戶交互,這類程序是用戶實(shí)實(shí)在在能感受到的。Android的應(yīng)用程序目前以Java語言進(jìn)行編輯。Android本事提供了桌面、聯(lián)系人、電話和瀏覽器等眾多的核心應(yīng)用。同時(shí)應(yīng)用程序的開發(fā)者還可以使用應(yīng)用程序框架層的API實(shí)現(xiàn)自己的程序,這也是Android開源的巨大潛力的體現(xiàn)。Android這種開放而強(qiáng)大的平臺(tái)給每個(gè)程序開發(fā)者

9、提供了公平的機(jī)會(huì),每一個(gè)開發(fā)者都可以加入移動(dòng)互聯(lián)的世界,共同推動(dòng)移動(dòng)互聯(lián)的發(fā)展。1.2.2應(yīng)用程序框架普通的開發(fā)者可以使用Android核心應(yīng)用程序使用的系統(tǒng)API。Android種的應(yīng)用開發(fā)框架設(shè)計(jì)的非常巧妙,通過這套應(yīng)用框架,各種組件可以被用戶的應(yīng)用重復(fù)利用,各種服務(wù)也可以被各種應(yīng)用重復(fù)利用。開發(fā)人員應(yīng)該很好地理解這套框架的工作機(jī)制,這樣才能開發(fā)出更好的應(yīng)用程序。1.2.3庫和運(yùn)行環(huán)境Android包含了一些C/C+庫,這些庫能被Android系統(tǒng)中不同的組件使用。它們通過Android應(yīng)用程序框架為開發(fā)者提供服務(wù)。以下是一些核心庫。系統(tǒng)C庫。一個(gè)從BSD繼承來的標(biāo)準(zhǔn)C系統(tǒng)函數(shù)庫(libc

10、),它是專門為基于嵌入式Linux的設(shè)備定制的。媒體庫?;赑acketVideo OpenCORE,改庫支持多種常用的音頻、視頻格式回放和錄制,同時(shí)支持靜態(tài)圖像文件。編碼格式包括MPEG4、H.264、MP3、AAC、AMR、JPG、PNG。Surface Manager。對(duì)顯示子系統(tǒng)的管理,并且為多個(gè)應(yīng)用程序提供了2D和3D圖層的無縫融合。LibWebCore。一個(gè)最新的Web瀏覽器引擎,用來支持Android瀏覽器和一個(gè)可嵌入的Web視圖。Android包括了一個(gè)核心庫,該核心庫提供了Java編程語言核心庫的大多數(shù)功能。1.3 Android應(yīng)用程序組成一般來說Android程序主要由下

11、列4部分組成,他們分別是:Activity、Broadcast Intent Receiver、Service、Content Provider。1.3.1 Activity介紹Activity是開發(fā)者遇到的最頻繁的應(yīng)用模塊,也是Android當(dāng)中最基本的模塊之一,在Android的程序當(dāng)中,Activity一般代表手機(jī)屏幕的一屏。在Activity當(dāng)中,可以添加一些View,并且可以對(duì)這些View做一些事件的處理。一般一個(gè)Android應(yīng)用是由多個(gè)Activity組成的,這多個(gè)Activity之間可以進(jìn)行相互跳轉(zhuǎn)。1.3.2 Broadcast Intent Receiver介紹可以使用Br

12、oadcast Receiver來讓應(yīng)用對(duì)一個(gè)外部的事件做出響應(yīng)。這是非常有意思的,例如,當(dāng)電話呼入這個(gè)外部事件的到來的時(shí)候,可以利用Broadcast Receiver進(jìn)行處理。例如,當(dāng)下載一個(gè)程序成功的完成的時(shí)候,任然可以利用Broadcast Receiver進(jìn)行處理。Broadcast Receiver不能生產(chǎn)UI,也就是說對(duì)于用戶來說不是透明的,用戶是看不到的。Broadcast Receiver既可以在AndroidManifest.xml中注冊(cè),也可以在運(yùn)行時(shí)的代碼中使用Context.registerReceiver()進(jìn)行注冊(cè)。只要是注冊(cè)了,當(dāng)時(shí)間來臨的時(shí)候,即使程序沒有啟動(dòng)

13、,系統(tǒng)也在需要的時(shí)候啟動(dòng)程序。各種應(yīng)用還可以通過使用Context.sendBroadcast()將它們自己的intent Broadcast廣播給其他應(yīng)用程序。1.3.3 Service介紹Service是一種程序,它可以運(yùn)行很長的時(shí)間,但是它卻沒有用戶界面。這么說有點(diǎn)枯燥,我們來看個(gè)例子。打開一個(gè)音樂播放器的程序,這個(gè)時(shí)候若想上網(wǎng)了,那么,我們打開Android的瀏覽器,這個(gè)時(shí)候雖然我們已經(jīng)進(jìn)入了瀏覽器這個(gè)程序,但是,歌曲的播放并沒有停止,而是在后臺(tái)繼續(xù)一首接一首的播放。其實(shí)這個(gè)播放就是由播放音樂的Service進(jìn)行控制。當(dāng)然這個(gè)播放音樂的Service也可以停止,例如,當(dāng)播放列表里面的歌

14、曲都結(jié)束,或者用戶按下停止音樂播放的快捷鍵等。1.3.4 Content Provider介紹Android這個(gè)系統(tǒng)和其他的操作系統(tǒng)還不太一樣,我們需要記住的是,數(shù)據(jù)在Android當(dāng)中是私有的,當(dāng)然這些數(shù)據(jù)包括文件數(shù)據(jù)和數(shù)據(jù)庫數(shù)據(jù),以及一些其他類型的數(shù)據(jù)。Content Provider就是用于兩個(gè)程序之間的數(shù)據(jù)交換的。一個(gè)Content Provider類實(shí)現(xiàn)了一組標(biāo)準(zhǔn)的方法接口,從而能夠讓其他的應(yīng)用保存或讀取此Content Provider的各種數(shù)據(jù)類型。也就是說,一個(gè)程序通過實(shí)現(xiàn)一個(gè)Content Provider的抽象接口將自己的數(shù)據(jù)暴露出去。外界根本看不到,也不用看到這個(gè)應(yīng)用暴露

15、的數(shù)據(jù)在應(yīng)用當(dāng)中是如何存儲(chǔ)的,即用數(shù)據(jù)庫存儲(chǔ)還是用文件存儲(chǔ),還是通過網(wǎng)上獲得,這些一切都不重要,重要的是外界可以通過這一套標(biāo)準(zhǔn)而統(tǒng)一的接口和程序里的數(shù)據(jù)打交道??梢宰x取程序的數(shù)據(jù),也可以刪除程序的數(shù)據(jù),當(dāng)然中間也會(huì)涉及一些權(quán)限問題。1.4 Android應(yīng)用工程文件組成圖一 項(xiàng)目結(jié)構(gòu)l 源文件(包含Activity)。源文件都在上邊的src目錄中。l R.java文件。這個(gè)是Eclipse自動(dòng)生成的,應(yīng)用開發(fā)者不需要去修改里邊的內(nèi)容。里邊內(nèi)容的修改也是有Eclipse自動(dòng)來處理的。R文件對(duì)于應(yīng)用開發(fā)者來說基本沒有什么用,但是對(duì)Android系統(tǒng)非常有用。在這個(gè)文件當(dāng)中,Android對(duì)下邊即將

16、介紹的資源進(jìn)行了全局的索引。在下邊介紹的res文件夾中,內(nèi)容發(fā)生任何變化,R.java都會(huì)重新編譯,同步更新的。l Android Library。這個(gè)是應(yīng)用運(yùn)行的Android庫。圖1顯示項(xiàng)目用的是Android 2.0的庫。l Assets 目錄。在這個(gè)目錄里邊主要放置多媒體等一些文件。l Res目錄。這個(gè)目錄主要放置應(yīng)用用到的資源文件。下邊分3個(gè)目錄進(jìn)行存放。當(dāng)這個(gè)目錄當(dāng)中的資源文件發(fā)生變化時(shí),上面的R文件的內(nèi)容就會(huì)自動(dòng)發(fā)生變化。l Drawable目錄。這里面主要放置應(yīng)用到的圖片資源。l Layout 目錄。主要存放布局文件,這些布局文件都是些XML文件。l Values 目錄。這個(gè)目

17、錄里邊主要放置字符串(string.xml)、顏色(color.xml)、數(shù)組(array.xml)。l AndroidManifest.xml這個(gè)文件相當(dāng)重要,相當(dāng)于應(yīng)用的配置文件。在這個(gè)文件里邊必須聲明應(yīng)用的名稱,應(yīng)用所用到的Action,Service,以及receiver等。 2 基于Android多媒體播放器設(shè)計(jì) 2.1 多媒體播放器功能設(shè)計(jì)l 播放列表(音樂、視頻各個(gè)實(shí)現(xiàn))l 視頻播放(上一個(gè)、下一個(gè)、快進(jìn)、快退、暫停、播放、進(jìn)度條)l 音樂播放(上一曲、下一曲、暫停、播放、進(jìn)度條、后臺(tái)播放)2.2 播放器詳細(xì)設(shè)計(jì)播放器具體的一些設(shè)計(jì),應(yīng)用的名稱、圖標(biāo)的選擇、UI設(shè)計(jì)、功能實(shí)現(xiàn)的核

18、心技術(shù)等。2.2.1 多媒體播放器應(yīng)用名稱本設(shè)計(jì)的應(yīng)用名稱叫MediaPlayer加上版本號(hào)。每次做出稍大改動(dòng)就會(huì)升級(jí)一個(gè)版本,增加0.1。本次設(shè)計(jì)到1.1版。2.2.2多媒體播放器應(yīng)用圖標(biāo)這個(gè)應(yīng)用沒有特意去找其他圖標(biāo),就采用的代表Android機(jī)器人圖標(biāo)。圖二 應(yīng)用圖標(biāo)2.2.3播放列表設(shè)計(jì)首先聲明一下這次播放列表的設(shè)計(jì)很簡(jiǎn)單,并沒用到數(shù)據(jù)庫SQLite。而是直接用到 IO的File。通過把多媒體文件放到模擬的SDCard里面對(duì)應(yīng)的目錄里面,打開應(yīng)用選擇void還是music傳遞參數(shù)得到對(duì)應(yīng)的path 后取得音樂List或者視頻List。播放列表的實(shí)現(xiàn)需要文件列表以及界面。這里有Androi

19、d提供的ListView這個(gè)類來實(shí)現(xiàn)。ListView是一個(gè)列表,列表一般都需要顯示數(shù)據(jù)。ListView需要和ArrayAdapter進(jìn)行綁定,然后把ArrayAdapter里面的數(shù)據(jù)顯示出來,而ArrayAdapter是有3個(gè)參數(shù)進(jìn)行構(gòu)造的。第一個(gè)參數(shù)是Context,及上下文的引用;第二個(gè)參數(shù)為一個(gè)R文件里面定義的Layout,只不過這里用的是系統(tǒng)的R文件;第三個(gè)參數(shù)是一個(gè)數(shù)組,當(dāng)然數(shù)組里邊的每一項(xiàng)的類型沒有限制。ArrayAdapter是ListAdapter的一個(gè)直接子類。它的作用就是一個(gè)數(shù)組和ListView之間的橋梁。他可以將數(shù)組里邊定義的數(shù)據(jù)一一對(duì)應(yīng)的顯示在Listview里邊

20、。通常由ArrayAdapter進(jìn)行適配的ListView每一項(xiàng)通常只有一個(gè)TextView,而TextView里邊顯示的內(nèi)容就是數(shù)字里邊的對(duì)象調(diào)用toString()方法后生成字符串。以下是如何把一個(gè)文件list通過ListView形成一個(gè)播放列表的核心代碼:protected void onStart() super.onStart();if (mFileNames.size() = 0) for (File file : mFiles) mFileNames.add(file.getName();/ 初始化mListViewmListView.setAdapter(new ArrayAd

21、apter(this,android.R.layout.simple_list_item_1, mFileNames.toArray(new String0);mListView.setItemsCanFocus(true);mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);mListView.setOnItemClickListener(this);Android的界面都是通過放在Layout里面的xml文件實(shí)現(xiàn)的,以下是播放列表界面的核心代碼:2.2.4視頻播放的設(shè)計(jì)視頻播放是由Android提供的widget編程實(shí)現(xiàn)的,整個(gè)視頻播放

22、窗口由widget下面的一個(gè)VideoView實(shí)現(xiàn),給VideoView指定視頻文件路徑就可以直接調(diào)用start()方法開始播放視頻。給VideoView設(shè)置一個(gè)MediaController就直接可以把播放控制的那些功能實(shí)現(xiàn)了。以下是視頻播放的核心代碼:protected void onCreate(Bundle savedInstanceState) / TODO Auto-generated method stubsuper.onCreate(savedInstanceState);this.setContentView(R.layout.player);this.getPath();t

23、his.play(path,name);toast = new Toast(this).makeText(this, 沒有了, 1000);protected void play(String path,String name)vv = (VideoView) this.findViewById(R.id.vv);MediaController mc = new MediaController(this);mc.setPrevNextListeners(next, prev);vv.setMediaController(mc);vv.setVideoPath(path);vv.requestF

24、ocus();this.setTitle(當(dāng)前: +name.substring(0, name.length() - 4);vv.start();以下是視頻播放界面的xml代碼:2.2.5音樂播放的設(shè)計(jì)音樂播放這個(gè)模塊用了Android提供的MediaPlayer這個(gè)類。首先介紹一下MediaPlayer1) 如何獲得MediaPlayer實(shí)例:可以使用直接new的方式: MediaPlayer mp = new MediaPlayer();也可以使用create的方式,如:MediaPlayer mp = MediaPlayer.create(this, R.raw.test);/這時(shí)就不

25、用調(diào)用setDataSource了2) 如何設(shè)置要播放的文件:MediaPlayer要播放的文件主要包括3個(gè)來源:a. 用戶在應(yīng)用中事先自帶的resource資源例如:MediaPlayer.create(this, R.raw.test);b. 存儲(chǔ)在SD卡或其他文件路徑下的媒體文件例如:mp.setDataSource(/sdcard/test.mp3);c. 網(wǎng)絡(luò)上的媒體文件例如:mp.setDataSource(MediaPlayer的setDataSource一共四個(gè)方法:setDataSource (String path) setDataSource (FileDescripto

26、r fd) setDataSource (Context context, Uri uri) setDataSource (FileDescriptor fd, long offset, long length)3)對(duì)播放器的主要控制方法:Android通過控制播放器的狀態(tài)的方式來控制媒體文件的播放,其中:prepare()和prepareAsync() 提供了同步和異步兩種方式設(shè)置播放器進(jìn)入prepare狀態(tài),需要注意的是,如果MediaPlayer實(shí)例是由create方法創(chuàng)建的,那么第一次啟動(dòng)播放前不需要再調(diào)用prepare()了,因?yàn)閏reate方法里已經(jīng)調(diào)用過了。start()是真正啟

27、動(dòng)文件播放的方法,pause()和stop()比較簡(jiǎn)單,起到暫停和停止播放的作用,seekTo()是定位方法,可以讓播放器從指定的位置開始播放,需要注意的是該方法是個(gè)異步方法,也就是說該方法返回時(shí)并不意味著定位完成,尤其是播放的網(wǎng)絡(luò)文件,真正定位完成時(shí)會(huì)觸發(fā)OnSeekComplete.onSeekComplete(),如果需要是可以調(diào)用setOnSeekCompleteListener(OnSeekCompleteListener)設(shè)置監(jiān)聽器來處理的。release()可以釋放播放器占用的資源,一旦確定不再使用播放器時(shí)應(yīng)當(dāng)盡早調(diào)用它釋放資源。reset()可以使播放器從Error狀態(tài)中恢復(fù)過

28、來,重新會(huì)到Idle狀態(tài)。4)設(shè)置播放器的監(jiān)聽器:MediaPlayer提供了一些設(shè)置不同監(jiān)聽器的方法來更好地對(duì)播放器的工作狀態(tài)進(jìn)行監(jiān)聽,以期及時(shí)處理各種情況,如:setOnCompletionListener(MediaPlayer.OnCompletionListener listener)、setOnErrorListener(MediaPlayer.OnErrorListener listener)等,設(shè)置播放器時(shí)需要考慮到播放器可能出現(xiàn)的情況設(shè)置好監(jiān)聽和處理邏輯,以保持播放器的健壯性。雖然有了這個(gè)類對(duì)音樂的播放算是解決了,也提供了start、stop、pause等方法。但是沒有像Vi

29、deoView可以直接設(shè)置一個(gè)MediaController就可以把控制功能做好。每一個(gè)功能都是自己弄一個(gè)按鈕添加事件監(jiān)聽器完成。然而這只是個(gè)小問題,這個(gè)音樂播放器的最大問題出現(xiàn)在后臺(tái)播放上面,也就是要用到Service。這里介紹一下Service工作原理:Service,看名字就知道跟正常理解的“服務(wù)”差不多,后臺(tái)運(yùn)行,可交互這樣的一個(gè)東西。它跟Activity的級(jí)別差不多,但是他不能自己運(yùn)行,需要通過某一個(gè)Activity或者其他Context對(duì)象來調(diào)用, Context.startService() 和 Context.bindService()。兩種啟動(dòng)Service的方式有所不同。這

30、里要說明一下的是如果你在Service的onCreate或者onStart做一些很耗時(shí)間的事情,最好在 Service里啟動(dòng)一個(gè)線程來完成,因?yàn)镾ervice是跑在主線程中,會(huì)影響到你的UI操作或者阻塞主線程中的其他事情。Service的生命周期:Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy我們有兩種方式啟動(dòng)一個(gè)Service,他們對(duì)Service生命周期的影響是不一樣的。1 通過startService service會(huì)經(jīng)歷 onCreate - onStartstopService的時(shí)候直接onDestroy如果是調(diào)用者

31、(TestServiceHolder)自己直接退出而沒有調(diào)用stopService的話,Service會(huì)一直在后臺(tái)運(yùn)行。下次TestServiceHolder再起來可以stopService。2 通過bindService Service只會(huì)運(yùn)行onCreate, 這個(gè)時(shí)候 TestServiceHolder 和TestService綁定在一起TestServiceHolder 退出了,Srevice就會(huì)調(diào)用onUnbind-onDestroyed所謂綁定在一起就共存亡了。有了Service,我可以把MediaPlayer這個(gè)對(duì)象放到Service里面。通過用外部的Activity來調(diào)用放在S

32、ervice里MediaPlayer提供的方法來對(duì)音樂播放器進(jìn)行控制。當(dāng)程序處在播放界面的時(shí)候,Service要和前臺(tái)界面上顯示的東西要做到同步。以下是Activity中初始化界面時(shí)需要與Service連接的代碼:private void init() button1 = (Button) findViewById(R.id.start);button1.setOnClickListener(startIt);button2 = (Button) findViewById(R.id.stop);button2.setOnClickListener(stopIt);button3 = (Butt

33、on) findViewById(R.id.prev);button3.setOnClickListener(prev);button4 = (Button) findViewById(R.id.next);button4.setOnClickListener(next);musicName = (TextView) this.findViewById(R.id.musicName);mSeekbar = (SeekBar) findViewById(R.id.seekBar);mShowNowTime = (TextView) findViewById(R.id.nowTime);mShow

34、AllTime = (TextView) findViewById(R.id.allTime);mSeekbar.setOnSeekBarChangeListener(listener_seek_bar);musicService.player.setOnPreparedListener(new OnPreparedListener() public void onPrepared(MediaPlayer mp) mTime = musicService.player.getDuration();mShowAllTime.setText(setTime(mTime);musicName.set

35、Text(musicService.getMusicName();mMaxProgress = mTime / 1000;mSeekbar.setMax(mMaxProgress);mSeekbar.setProgress(1);mHandler.removeMessages(MESSAGE);mHandler.sendMessage(mHandler.obtainMessage(MESSAGE);Log.e(PREPARED, setOnPreparedListener););if(musicService.isPlaying()int p = musicService.player.get

36、CurrentPosition()/1000;mTime = musicService.player.getDuration();mShowAllTime.setText(setTime(mTime);musicName.setText(musicService.getMusicName();mMaxProgress = mTime / 1000;mSeekbar.setMax(mMaxProgress);mSeekbar.setProgress(p);mHandler.sendMessage(mHandler.obtainMessage(MESSAGE);elsetrymusicServic

37、e.player.prepare();catch(Exception e)musicService.player.start();以下是Service中對(duì)MediaPlayer控制的核心代碼:public void onStart(Intent intent, int startId) super.onStart(intent, startId);position = intent.getExtras().getInt(position);musicPath = mFiles.get(position).getPath();musicName = mFiles.get(position).ge

38、tName();if (isPlaying() reset();setPath();/ 設(shè)置文件路徑public void setPath() try player.setDataSource(musicPath); catch (Exception e) e.printStackTrace();/ 播放 暫停public void playOrPause() Log.e(paly, playOrPause);if (isPlaying() player.pause(); else player.start();public void playNext() Log.e(paly, playNe

39、xt);if (position = -1) return;if (position = mFiles.size() - 1) musicName = none;return;musicPath = mFiles.get(+position).getPath();musicName = mFiles.get(position).getName();reset();setPath();play();public void playPrev() Log.e(paly, playPrev);if (position = -1) return;if (position = 0) musicName = none;return;musicPath = mFiles.get(-position).getPath();musicName = mFiles.get(position).getName();reset();setPath();play();public void play() try player.prepare(); catch (Exception e) e.printStackTrace();

溫馨提示

  • 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. 人人文庫網(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)論