一.MediaPlayer簡(jiǎn)介
Android多媒體中的——MediaPlayer束亏,我們可以通過這個(gè)API來播放音頻和視頻
該類是Androd多媒體框架中的一個(gè)重要組件碍遍,通過該類阳液,我們可以以最小的步驟來獲取,解碼 和播放音視頻东跪。
二.MediaPlayer的使用
想使用該類鹰溜,需要先創(chuàng)建對(duì)象,以下是兩種創(chuàng)建對(duì)象的方式:
a斋日、可以使用直接new的方式: MediaPlayer mp = new MediaPlayer();
b墓陈、使用create的方式:MediaPlayer mp = MediaPlayer.create(this, R.raw.test);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("http://www.citynorth.cn/music/confucius.mp3");
在網(wǎng)易云音樂找到你要下載的歌曲 用網(wǎng)頁版打開 復(fù)制鏈接中的歌曲ID 如:
Mike Zhou - The Dawn (亡靈序曲完美鋼琴版)
http://music.163.com/#/song?id=476592630
ID就是476592630
然后將ID替換到鏈接 http://music.163.com/song/media/outer/url?id= .mp3 中
如:http://music.163.com/song/media/outer/url?id=476592630.mp3
- MediaPlayer的setDataSource一共四個(gè)方法:
setDataSource (String path)
setDataSource (FileDescriptor fd)
setDataSource (Context context, Uri uri)
setDataSource (FileDescriptor fd, long offset, long length)
其中使用FileDescriptor時(shí)橡伞,需要將文件放到與res文件夾平級(jí)的assets文件夾里,然后使用:
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
來設(shè)置datasource
注意:如果使用系統(tǒng)創(chuàng)建assets文件,查看build.gradle是否有如下配置,如沒有,手動(dòng)添加,否則音樂播放失敗:
android {
compileSdkVersion 27
...
sourceSets { main { assets.srcDirs = ['src/assets', 'src/assets/'] } }
}
4.MediaPlayer的常見方法
Android通過控制播放器的狀態(tài)的方式來控制媒體文件的播放刚盈,其中:
4.1 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)用過了;
4.2 start()是真正啟動(dòng)文件播放的方法;
4.3 pause()和stop()比較簡(jiǎn)單侮繁,起到暫停和停止播放的作用;
4.4 seekTo()是定位方法如孝,可以讓播放器從指定的位置開始播放,需要注意的是該方法是個(gè)異步方法斋射,也就是說該方法返回時(shí)并不意味著定位完成但荤,尤其是播放的網(wǎng)絡(luò)文件,真正定位完成時(shí)會(huì)觸發(fā)OnSeekComplete.onSeekComplete()桑包,如果需要是可以調(diào)用setOnSeekCompleteListener(OnSeekCompleteListener)設(shè)置監(jiān)聽器來處理的纺非。
4.5 release()可以釋放播放器占用的資源赘方,一旦確定不再使用播放器時(shí)應(yīng)當(dāng)盡早調(diào)用它釋放資源窄陡。
4.6 reset()可以使播放器從Error狀態(tài)中恢復(fù)過來拆火,重新會(huì)到Idle狀態(tài)。
4.7 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)聽和處理邏輯贩汉,以保持播放器的健壯性反砌。
三.實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音樂播放器:
1宴树、創(chuàng)建MediaPlayer實(shí)例
//實(shí)例了一個(gè)mediaplayer晶疼,并給它裝在了音樂
MediaPlayer mediaPlayer=mediaPlayer.create(this, R.raw.music); MediaPlayer mediaPlayer=new MediaPlayer();
//創(chuàng)建完實(shí)例后,第二步加載資源
2锭吨、加載資源文件
String path=Environment.getExternalStorageDirectory(). getAbsolutePath()+"/music.mp3";
mediaPlayer.setDataSource(path);
//如果是setDataSource寒匙,那么調(diào)用完這個(gè)文件之后,音頻文件沒有真正的加載
//要調(diào)用prepare方法
//異步的加載方式
//mediaPlayer.prepareAsync();
mediaPlayer.prepare();
//設(shè)置循環(huán)播放
mediaPlayer.setLooping(false);
3考蕾、音樂的開始播放和暫停
通過以上步驟会宪,就可以開始播放咱們的音樂了:
a、播放音樂:
mediaPlayer.start();
b塞帐、暫停音樂:
mediaPlayer.pause();
c、當(dāng)音樂停止后需要釋放資源
mediaPlayer.stop(); mediaPlayer.reset(); mediaPlayer=null;//回收資源