【移動應(yīng)用開發(fā)技術(shù)】Android MediaPlayer如何實(shí)現(xiàn)播放音頻的方式_第1頁
【移動應(yīng)用開發(fā)技術(shù)】Android MediaPlayer如何實(shí)現(xiàn)播放音頻的方式_第2頁
【移動應(yīng)用開發(fā)技術(shù)】Android MediaPlayer如何實(shí)現(xiàn)播放音頻的方式_第3頁
【移動應(yīng)用開發(fā)技術(shù)】Android MediaPlayer如何實(shí)現(xiàn)播放音頻的方式_第4頁
【移動應(yīng)用開發(fā)技術(shù)】Android MediaPlayer如何實(shí)現(xiàn)播放音頻的方式_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】AndroidMediaPlayer如何實(shí)現(xiàn)播放音頻的方式

在下給大家分享一下AndroidMediaPlayer如何實(shí)現(xiàn)播放音頻的方式,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!主要介紹使用MediaPlayer播放音頻的方式。關(guān)于MediaPlayer的基礎(chǔ)知識,比如狀態(tài),可以參考AndroidMediaPlayer基礎(chǔ)簡介。為了方便表達(dá),定義變量名為mediaPlayer。MediaPlayer的使用方式創(chuàng)建MediaPlayer可以直接newMediaPlayer,也可以用MediaPlayer提供的create方法創(chuàng)建。mediaPlayer=newMediaPlayer();使用create方法創(chuàng)建成功后,mediaPlayer處于Prepared狀態(tài)??梢灾苯觭tart播放。mediaPlayer

=

MediaPlayer.create(getApplicationContext(),

Uri.fromFile(file));

mediaPlayer.start();設(shè)置音源-setDataSource通過調(diào)用setDataSource來設(shè)置音源。setDataSource有多個重載方法,我們來看常用的幾種。例如設(shè)置使用assets里的資源。實(shí)際情況可能需要trycatch。AssetFileDescriptor

fd

=

null;

MediaPlayer

mediaPlayer

=

new

MediaPlayer();

fd

=

context.getApplicationContext().getAssets().openFd(name);

mediaPlayer.setDataSource(fd.getFileDescriptor(),

fd.getStartOffset(),

fd.getLength());本地文件,需要文件的絕對路徑。mediaPlayer.setDataSource(file.getAbsolutePath());或者獲取文件的Uri來創(chuàng)建mediaPlayer。mediaPlayer

=

MediaPlayer.create(getApplicationContext(),

Uri.fromFile(file));設(shè)置網(wǎng)絡(luò)音頻,也是用setDataSource方法,設(shè)置url。mediaPlayer.setDataSource("/sample.mp3"));播放網(wǎng)絡(luò)音頻時,如果使用的是http,有可能會報錯java.io.IOException:

Cleartext

HTTP

traffic

to

not

permitted可以簡單地設(shè)置一下manifest,設(shè)置usesCleartextTraffic=”true”<application

android:usesCleartextTraffic="true">準(zhǔn)備-prepare同步和異步準(zhǔn)備音頻資源。prepareAsync()是異步的方式,prepare是同步的。注意線程調(diào)度問題,同時不要阻塞UI線程。使用異步方式準(zhǔn)備音頻,經(jīng)常與MediaPlayer.OnPreparedListener監(jiān)聽器配合使用。異步準(zhǔn)備時,也可以進(jìn)行其他的設(shè)置。mediaPlayer.prepareAsync();

mediaPlayer.setOnPreparedListener(new

MediaPlayer.OnPreparedListener()

{

@Override

public

void

onPrepared(MediaPlayer

mediaPlayer)

{

mediaPlayer.start();

//

準(zhǔn)備好了就播放

}

});循環(huán)播放-Looping設(shè)置循環(huán)播放setLooping。mediaPlayer.setLooping(true);播放完畢后,不會回調(diào)OnCompletionListener,而是從頭播放當(dāng)前音頻。播放-start播放音頻,調(diào)用start方法。mediaPlayer.start();處于Prepared,Pause和PlaybackComplete狀態(tài)時,可以調(diào)用start方法,進(jìn)入Started狀態(tài)。暫停-pause暫停播放,使用pause方法。在暫停前先判斷一下mediaPlayer的是否在播放。if

(mediaPlayer.isPlaying())

{

mediaPlayer.pause();

}暫停成功則處于Paused狀態(tài)。停止-stop回顧一下MediaPlayer狀態(tài)切換的圖示,我們可以得知在播放中,暫停,播放完成這3個狀態(tài)下,可以調(diào)用stop方法,進(jìn)入Stopped狀態(tài)。mediaPlayer.stop();調(diào)進(jìn)度-seekTo調(diào)整播放進(jìn)度。我們平時使用音樂播放軟件一般都會有這個功能。seekTo方法接受一個毫秒?yún)?shù)。int

targetMS

=

(int)

(percent

*

mediaPlayer.getDuration());

mediaPlayer.seekTo(targetMS);seekTo并不會改變MediaPlayer的狀態(tài)。int

targetMS

=

(int)

(percent

*

mediaPlayer.getDuration());

mediaPlayer.seekTo(targetMS);reset后的mediaPlayer進(jìn)入Idle狀態(tài)。需要重新設(shè)置音源與準(zhǔn)備。釋放-release不再使用這個mediaPlayer時,應(yīng)當(dāng)盡快釋放掉,以釋放相關(guān)的資源。調(diào)用release后,mediaPlayer進(jìn)入End狀態(tài)。此時這個mediaPlayer就不能再使用了。常用監(jiān)聽器緩沖監(jiān)聽器OnBufferingUpdateListener比如我們加載網(wǎng)絡(luò)音頻的時候,常用這個監(jiān)聽器來監(jiān)聽緩沖進(jìn)度。顯示緩沖進(jìn)度,也可以提高用戶體驗(yàn)。mMediaPlayer.prepareAsync();

mMediaPlayer.setOnBufferingUpdateListener(new

MediaPlayer.OnBufferingUpdateListener()

{

@Override

public

void

onBufferingUpdate(MediaPlayer

mp,

int

percent)

{

//

percent代表緩沖百分比

}

});錯誤監(jiān)聽器OnErrorListenermediaPlayer.setOnErrorListener(new

MediaPlayer.OnErrorListener()

{

@Override

public

boolean

onError(MediaPlayer

mediaPlayer,

int

i,

int

i1)

{

return

true;

//

返回true表示在此處理錯誤,不會回調(diào)onCompletion

}

});注意onError的返回值。可以選擇自己處理error。

*

@return

True

if

the

method

handled

the

error,

false

if

it

didn't.

*

Returning

false,

or

not

having

an

OnErrorListener

at

all,

will

*

cause

the

OnCompletionListener

to

be

called.

*/

boolean

onError(MediaPlayer

mp,

int

what,

int

extra);播放完畢監(jiān)聽器OnCompletionListenermediaPlayer.setOnCompletionListener(new

MediaPlayer.OnCompletionListener()

{

@Override

public

void

onCompletion(MediaPlayer

mediaPlayer)

{

//

播放完畢

}

});使用示例播放assets里的音頻播放assets里的音頻文件,使用到AssetFileDescriptor類。使用后記得關(guān)閉AssetFileDescriptor。private

void

playAssetsAudio(final

String

name,

Context

context)

{

Log.d(TAG,

"playAssetWordSound:

try

to

play

assets

sound

file.

->

"

+

name);

AssetFileDescriptor

fd

=

null;

try

{

MediaPlayer

mediaPlayer;

Log.v(TAG,

"Looking

in

assets.");

fd

=

context.getApplicationContext().getAssets().openFd(name);

mediaPlayer

=

new

MediaPlayer();

mediaPlayer.reset();

mediaPlayer.setDataSource(fd.getFileDescriptor(),

fd.getStartOffset(),

fd.getLength());

mediaPlayer.prepareAsync();

mediaPlayer.setOnPreparedListener(new

MediaPlayer.OnPreparedListener()

{

@Override

public

void

onPrepared(MediaPlayer

mediaPlayer)

{

Log.d(TAG,

"onPrepared:

"

+

name);

mediaPlayer.start();

}

});

mediaPlayer.setOnCompletionListener(new

MediaPlayer.OnCompletionListener()

{

@Override

public

void

onCompletion(MediaPlayer

mp)

{

mp.release();

Log.d(TAG,

"onCompletion:

"

+

name);

}

});

mediaPlayer.setOnErrorListener(new

MediaPlayer.OnErrorListener()

{

@Override

public

boolean

onError(MediaPlayer

mp,

int

i,

int

i1)

{

mp.release();

return

true;

}

});

}

catch

(Exception

e)

{

try

{

if

(fd

!=

null)

{

fd.close();

}

}

catch

(Exception

e1)

{

Log.e(TAG,

"Exception

close

fd:

",

e1);

}

}

finally

{

if

(fd

!=

null)

{

try

{

fd.close();

}

catch

(IOException

e)

{

Log.e(TAG,

"Finally,

close

fd

",

e);

}

}

}

}播放本地音頻文件嘗試播放音頻文件。僅播放一次。private

void

playAudioFile(final

File

file)

{

Log.d(TAG,

"playAudioFile:

"

+

file.getAbsolutePath());

MediaPlayer

mediaPlayer;

try

{

mediaPlayer

=

new

MediaPlayer();

mediaPlayer.setLooping(false);

mediaPlayer.setDataSource(file.getAbsolutePath());

mediaPlayer.prepare();

mediaPlayer.start();

mediaPlayer.setOnCompletionListener(new

MediaPlayer.OnCompletionListener()

{

@Override

public

void

onCompletion(MediaPlayer

mp)

{

mp.release();

}

});

mediaPlayer.setOnErrorListener(new

MediaPlayer.OnErrorListener()

{

@Override

public

boolean

onError(MediaPlayer

mediaPlayer,

int

i,

int

i1)

{

Log.d(TAG,

"Play

local

sound

onError:

"

+

i

+

",

"

+

i1);

return

true;

}

});

}

catch

(Exception

e)

{

Log.e(TAG,

"playAudioFile:

",

e);

}

}播放在線音頻設(shè)置url,播放在線音頻private

void

playOnlineSound(String

soundUrlDict)

{

try

{

MediaPlayer

mediaPlayer

=

new

MediaPlayer();

mediaPlayer.setDataSource(soundUrlDict);

mediaPlayer.prepareAsync();

mediaPlayer.setOnPreparedListener(new

M

溫馨提示

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

評論

0/150

提交評論