下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.MediaPlayer類(lèi)可用于控制音頻/視頻文件或流的播放。關(guān)于如何使用這個(gè)類(lèi)的方法還可以閱讀VideoView類(lèi)的文檔。1狀態(tài)圖對(duì)播放音頻/視頻文件和流的控制是通過(guò)一個(gè)狀態(tài)機(jī)來(lái)管理的。下圖顯示一個(gè)MediaPlayer對(duì)象被支持的播放控制操作驅(qū)動(dòng)的生命周期和狀態(tài)。橢圓代表MediaPlayer對(duì)象可能駐留的狀態(tài)?;【€表示驅(qū)動(dòng)MediaPlayer在各個(gè)狀態(tài)之間遷移的播放控制操作。這里有兩種類(lèi)型的弧線。由一個(gè)箭頭開(kāi)始的弧代表同步的方法調(diào)用,而以雙箭頭開(kāi)頭的代表的弧線代表異步方法調(diào)用。 通過(guò)這張圖,我們可以知道一個(gè)MediaPlayer對(duì)象有以下的狀態(tài):1)當(dāng)一個(gè)MediaPlaye
2、r對(duì)象被剛剛用new操作符創(chuàng)建或是調(diào)用了reset()方法后,它就處于Idle狀態(tài)。當(dāng)調(diào)用了release()方法后,它就處于End狀態(tài)。這兩種狀態(tài)之間是MediaPlayer對(duì)象的生命周期。1.1) 在一個(gè)新構(gòu)建的MediaPlayer對(duì)象和一個(gè)調(diào)用了reset()方法的MediaPlayer對(duì)象之間有一個(gè)微小的但是十分重要的差別。在處于Idle狀態(tài)時(shí),調(diào)用getCurrentPosition(), getDuration(), getVideoHeight(), getVideoWidth(), setAudioStreamType(int),
3、60;setLooping(boolean), setVolume(float, float), pause(), start(), stop(), seekTo(int), prepare() 或者 prepareAsync() 方法都是編程錯(cuò)誤。當(dāng)一個(gè)MediaPlayer對(duì)象剛被構(gòu)建的時(shí)候,內(nèi)部的播放引擎和對(duì)象的狀態(tài)都沒(méi)有改變,在這個(gè)時(shí)候調(diào)用以上的那些方法,框架將無(wú)法回調(diào)客戶端程序注冊(cè)的OnErrorListener.onError()方法;但若這個(gè)MediaPlayer對(duì)象調(diào)用了reset()方法
4、之后,再調(diào)用以上的那些方法,內(nèi)部的播放引擎就會(huì)回調(diào)客戶端程序注冊(cè)的OnErrorListener.onError()方法了,并將錯(cuò)誤的狀態(tài)傳入。1.2) 我們建議,一旦一個(gè)MediaPlayer對(duì)象不再被使用,應(yīng)立即調(diào)用release()方法來(lái)釋放在內(nèi)部的播放引擎中與這個(gè)MediaPlayer對(duì)象關(guān)聯(lián)的資源。資源可能包括如硬件加速組件的單態(tài)組件,若沒(méi)有調(diào)用release()方法可能會(huì)導(dǎo)致之后的MediaPlayer對(duì)象實(shí)例無(wú)法使用這種單態(tài)硬件資源,從而退回到軟件實(shí)現(xiàn)或運(yùn)行失敗。一旦MediaPlayer對(duì)象進(jìn)入了End狀態(tài),它不能再被使用,也沒(méi)有辦法再遷移到其它狀態(tài)。1.3) 此外,使用new
5、操作符創(chuàng)建的MediaPlayer對(duì)象處于Idle狀態(tài),而那些通過(guò)重載的create()便利方法創(chuàng)建的MediaPlayer對(duì)象卻不是處于Idle狀態(tài)。事實(shí)上,如果成功調(diào)用了重載的create()方法,那么這些對(duì)象已經(jīng)是Prepare狀態(tài)了。 2) 在一般情況下,由于種種原因一些播放控制操作可能會(huì)失敗,如不支持的音頻/視頻格式,缺少隔行掃描的音頻/視頻,分辨率太高,流超時(shí)等原因,等等。因此,錯(cuò)誤報(bào)告和恢復(fù)在這種情況下是非常重要的。有時(shí),由于編程錯(cuò)誤,在處于無(wú)效狀態(tài)的情況下調(diào)用了一個(gè)播放控制操作可能發(fā)生。在所有這些錯(cuò)誤條件下,內(nèi)部的播放引擎會(huì)調(diào)用一個(gè)由客戶端程序員提供的OnE
6、rrorListener.onError()方法。客戶端程序員可以通過(guò)調(diào)用MediaPlayer.setOnErrorListener(android.media.MediaPlayer.OnErrorListener)方法來(lái)注冊(cè)O(shè)nErrorListener.2.1) 一旦發(fā)生錯(cuò)誤,MediaPlayer對(duì)象會(huì)進(jìn)入到Error狀態(tài)。2.2) 為了重用一個(gè)處于Error狀態(tài)的MediaPlayer對(duì)象,可以調(diào)用reset()方法來(lái)把這個(gè)對(duì)象恢復(fù)成Idle狀態(tài)。2.3) 注冊(cè)一個(gè)OnErrorListener來(lái)獲知內(nèi)部播放引擎發(fā)生的錯(cuò)誤是好的編程習(xí)慣。2.4) 在不合法的狀態(tài)下調(diào)用一些方法,如p
7、repare(),prepareAsync()和setDataSource()方法會(huì)拋出IllegalStateException異常。 3) 調(diào)用setDataSource(FileDescriptor)方法,或setDataSource(String)方法,或setDataSource(Context,Uri)方法,或setDataSource(FileDescriptor,long,long)方法會(huì)使處于Idle狀態(tài)的對(duì)象遷移到Initialized狀態(tài)。3.1) 若當(dāng)此MediaPlayer處于其它的狀態(tài)下,調(diào)用setDataSource()方法,會(huì)拋出Illega
8、lStateException異常。3.2) 好的編程習(xí)慣是不要疏忽了調(diào)用setDataSource()方法的時(shí)候可能會(huì)拋出的IllegalArgumentException異常和IOException異常。 4) 在開(kāi)始播放之前,MediaPlayer對(duì)象必須要進(jìn)入Prepared狀態(tài)。4.1) 有兩種方法(同步和異步)可以使MediaPlayer對(duì)象進(jìn)入Prepared狀態(tài):要么調(diào)用prepare()方法(同步),此方法返回就表示該MediaPlayer對(duì)象已經(jīng)進(jìn)入了Prepared狀態(tài);要么調(diào)用prepareAsync()方法(異步),此方法會(huì)使此MediaPlayer對(duì)象進(jìn)入
9、Preparing狀態(tài)并返回,而內(nèi)部的播放引擎會(huì)繼續(xù)未完成的準(zhǔn)備工作。當(dāng)同步版本返回時(shí)或異步版本的準(zhǔn)備工作完全完成時(shí)就會(huì)調(diào)用客戶端程序員提供的OnPreparedListener.onPrepared()監(jiān)聽(tīng)方法。可以調(diào)用MediaPlayer.setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener)方法來(lái)注冊(cè)O(shè)nPreparedListener.4.2) Preparing是一個(gè)中間狀態(tài),在此狀態(tài)下調(diào)用任何具備邊影響的方法的結(jié)果都是未知的!4.3) 在不合適的狀態(tài)下調(diào)用prepare()和prepareA
10、sync()方法會(huì)拋出IllegalStateException異常。當(dāng)MediaPlayer對(duì)象處于Prepared狀態(tài)的時(shí)候,可以調(diào)整音頻/視頻的屬性,如音量,播放時(shí)是否一直亮屏,循環(huán)播放等。 5) 要開(kāi)始播放,必須調(diào)用start()方法。當(dāng)此方法成功返回時(shí),MediaPlayer的對(duì)象處于Started狀態(tài)。isPlaying()方法可以被調(diào)用來(lái)測(cè)試某個(gè)MediaPlayer對(duì)象是否在Started狀態(tài)。5.1) 當(dāng)處于Started狀態(tài)時(shí),內(nèi)部播放引擎會(huì)調(diào)用客戶端程序員提供的OnBufferingUpdateListener.onBufferingUpdate()回調(diào)方法,此
11、回調(diào)方法允許應(yīng)用程序追蹤流播放的緩沖的狀態(tài)。5.2) 對(duì)一個(gè)已經(jīng)處于Started 狀態(tài)的MediaPlayer對(duì)象調(diào)用start()方法沒(méi)有影響。6) 播放可以被暫停,停止,以及調(diào)整當(dāng)前播放位置。當(dāng)調(diào)用pause()方法并返回時(shí),會(huì)使MediaPlayer對(duì)象進(jìn)入Paused狀態(tài)。注意Started與Paused狀態(tài)的相互轉(zhuǎn)換在內(nèi)部的播放引擎中是異步的。所以可能需要一點(diǎn)時(shí)間在isPlaying()方法中更新?tīng)顟B(tài),若在播放流內(nèi)容,這段時(shí)間可能會(huì)有幾秒鐘。6.1) 調(diào)用start()方法會(huì)讓一個(gè)處于Paused狀態(tài)的MediaPlayer對(duì)象從之前暫停的地方恢復(fù)播放。當(dāng)調(diào)用start(
12、)方法返回的時(shí)候,MediaPlayer對(duì)象的狀態(tài)會(huì)又變成Started狀態(tài)。6.2) 對(duì)一個(gè)已經(jīng)處于Paused狀態(tài)的MediaPlayer對(duì)象pause()方法沒(méi)有影響。7) 調(diào)用stop()方法會(huì)停止播放,并且還會(huì)讓一個(gè)處于Started,Paused,Prepared或PlaybackCompleted狀態(tài)的MediaPlayer進(jìn)入Stopped狀態(tài)。7.1) 對(duì)一個(gè)已經(jīng)處于Stopped狀態(tài)的MediaPlayer對(duì)象stop()方法沒(méi)有影響。8) 調(diào)用seekTo()方法可以調(diào)整播放的位置。8.1) seekTo(int)方法是異步執(zhí)行的,所以它可以馬上返回,但是實(shí)際的
13、定位播放操作可能需要一段時(shí)間才能完成,尤其是播放流形式的音頻/視頻。當(dāng)實(shí)際的定位播放操作完成之后,內(nèi)部的播放引擎會(huì)調(diào)用客戶端程序員提供的OnSeekComplete.onSeekComplete()回調(diào)方法??梢酝ㄟ^(guò)setOnSeekCompleteListener(OnSeekCompleteListener)方法注冊(cè)。8.2) 注意,seekTo(int)方法也可以在其它狀態(tài)下調(diào)用,比如Prepared,Paused和PlaybackCompleted狀態(tài)。此外,目前的播放位置,實(shí)際可以調(diào)用getCurrentPosition()方法得到,它可以幫助如音樂(lè)播放器的應(yīng)用程序不斷更新播放進(jìn)度9) 當(dāng)播放到流的末尾,播放就完成了。9.1) 如果調(diào)用了setLooping(boolean)方法開(kāi)啟了循環(huán)模式,那么這個(gè)MediaPlayer對(duì)象會(huì)重新進(jìn)入Started狀態(tài)。9.2) 若沒(méi)有開(kāi)啟循環(huán)模式,那么內(nèi)部的播放引擎會(huì)調(diào)用客戶端程序員提供的OnCompletion.onCompletion()回調(diào)方法。可以通過(guò)調(diào)用MediaPlaye
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖北省麻城市集美學(xué)校初中體育《短跑技術(shù)-終點(diǎn)沖刺跑》教學(xué)實(shí)錄
- 機(jī)構(gòu)會(huì)員合同范例
- 2025年廣安貨運(yùn)從業(yè)資格證模擬考
- 電力審計(jì)合同范例
- 中國(guó) 并購(gòu)合同范例
- 2025年新疆貨運(yùn)從業(yè)資格證考試模擬題及答案解析
- 電路設(shè)計(jì)要求合同范例
- 客戶購(gòu)買(mǎi)隱形車(chē)衣合同范例
- 2025年南昌貨運(yùn)從業(yè)資格證考試答案大全及答案
- 臨時(shí)簡(jiǎn)易合同范例
- 職業(yè)生涯規(guī)劃成品
- 期末模擬卷01(全國(guó)適用)-【中職專(zhuān)用】高二語(yǔ)文上學(xué)期職業(yè)模塊期末模擬卷(解析版)
- 漏洞修復(fù)策略優(yōu)化
- 手術(shù)安全培訓(xùn)
- 司機(jī)聘用協(xié)議書(shū)與司機(jī)聘用合同
- 汽車(chē)吊安全教育培訓(xùn)
- 浙江省寧波市慈溪市2023-2024學(xué)年高二上學(xué)期期末考試 物理 含解析
- 2024七年級(jí)數(shù)學(xué)上冊(cè)第4章相交線與平等線項(xiàng)目學(xué)習(xí)2包裝中的智慧習(xí)題課件新版華東師大版
- 2024湖南田漢大劇院事業(yè)單位招聘若干人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2024年部門(mén)年終總結(jié)
- 碼頭安全生產(chǎn)知識(shí)培訓(xùn)
評(píng)論
0/150
提交評(píng)論