版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初級會計職稱考試初級會計實(shí)務(wù)第一章資產(chǎn)習(xí)題及答案解析
- 2018年初級社會工作考試復(fù)習(xí)題及答案
- 創(chuàng)新人才培養(yǎng)的核心目標(biāo)與定位
- 汽車行業(yè)創(chuàng)新人才培養(yǎng)體系建設(shè)的策略及實(shí)施路徑
- Unit 3 Sports and Fitness Reading for Writing 說課稿 -2024-2025學(xué)年高一英語人教版(2019)必修第一冊
- Unit3 Amazing animals Part A Lets talk(說課稿)-2024-2025學(xué)年人教PEP版(2024)英語三年級上冊
- 2025年計劃生育工作計劃怎么寫
- 2025年小學(xué)工作計劃
- 2025年度第一學(xué)期安全工作計劃
- 2025年度國家星火計劃項(xiàng)目申報要求
- 24年海南生物會考試卷
- 國家戰(zhàn)略思維課件
- 施工單位自評報告
- 招商租金政策方案
- 銀行金庫集中可行性報告
- 鍍膜員工述職報告
- 工程結(jié)算中的風(fēng)險識別與防控
- 安全教育培訓(xùn)課件:意識與態(tài)度
- 《礦區(qū)水文地質(zhì)工程地質(zhì)勘探規(guī)范》水文地質(zhì)單元及侵蝕基準(zhǔn)面劃分的探討
- PAC人流術(shù)后關(guān)愛與健康教育
- 眼瞼衰老機(jī)制與干預(yù)
評論
0/150
提交評論