聲明:學(xué)習(xí)的書籍《Android應(yīng)用開發(fā)揭秘》,這里記錄學(xué)習(xí)該書籍的日志,引用的相關(guān)代碼與總結(jié)描述,沒有商業(yè)的用途,完全是自我學(xué)習(xí)的一個記錄,剛剛學(xué)習(xí)不可避免會出現(xiàn)很多問題,若是有錯誤還請大家多多批評。
今天開始學(xué)習(xí)多媒體相關(guān)的操作,因為我們的智能手機一部分重要的作用就是播放音頻,視頻,顯示圖片等操作。Android主要是通過Open Core作為多媒體框架的核心,也被稱作為PV,支持多種格式的音頻,視頻。Open Core框架主要包含兩部分:
(1) PVPlayer:提供媒體播放器功能。
(2) PVAuthor:提供媒體流記錄的功能,完成各種音頻,視頻的流以及圖像的捕捉功能。
當(dāng)然我們開發(fā)中,不會直接操作底層的PV,主要使用Android提供的Media API。
1. MediaPlayer類
該類主要用來播放,音頻,視頻和流媒體,包含了Audio和Video的播放功能,具體的生命周期與相關(guān)方法,可以參考下面音樂播放實例。
2. MediaRecorder類
該類主要用于媒體的采樣,包括音頻視頻。MediaRecorder作為狀態(tài)機運行,需要設(shè)置不同的,比如源設(shè)備和格式。設(shè)置后,可以執(zhí)行任何時間長度的錄制,直到用戶停止。
一、多媒體之音樂播放
下面就以音樂播放的例子來驗證MediaPlayer的生命周期以及相關(guān)方法,關(guān)于音樂播放其實之前例子已經(jīng)實現(xiàn),當(dāng)時是播放的raw目錄下得mp3文件,本例子自動播放SDCard下的mp3例子。
關(guān)鍵源碼:
public class SDCardMusicPlayActivity extends ListActivity {
private ImageButton mFrontImageButton = null;
private ImageButton mStopImageButton = null;
private ImageButton mStartImageButton = null;
private ImageButton mPauseImageButton = null;
private ImageButton mNextImageButton = null;
public MediaPlayer mMediaPlayer = null; //MediaPlayer對象
private List<String> mMusicList = new ArrayList<String>();//播放列表
private int currentListItem = 0; //當(dāng)前播放歌曲的索引
private static final String MUSIC_PATH = new String("/mnt/sdcard/");//音樂的路徑
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
musicList(); //更新顯示播放列表
mMediaPlayer = new MediaPlayer();
mFrontImageButton = (ImageButton) findViewById(R.id.LastImageButton);
mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton);
mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton);
mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton);
mNextImageButton = (ImageButton) findViewById(R.id.NextImageButton);
//停止按鈕
mStopImageButton.setOnClickListener(new ImageButton.OnClickListener() {
public void onClick(View v) {
if(mMediaPlayer.isPlaying()){ //當(dāng)前是否正在播放
mMediaPlayer.reset(); //重置MediaPlayer到初始狀態(tài)
}
}
});
//開始按鈕
mStartImageButton.setOnClickListener(new ImageButton.OnClickListener() {
public void onClick(View v) {
playMusic(MUSIC_PATH + mMusicList.get(currentListItem));
}
});
//暫停按鈕
mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener() {
public void onClick(View v) {
if(mMediaPlayer.isPlaying()){
mMediaPlayer.pause();
}else{
mMediaPlayer.start();
}
}
});
//下一首
mNextImageButton.setOnClickListener(new ImageButton.OnClickListener() {
public void onClick(View arg0){
nextMusic();
}
});
//上一首
mFrontImageButton.setOnClickListener(new ImageButton.OnClickListener() {
public void onClick(View arg0){
FrontMusic();
}
});
}
//播放列表
private void musicList() {
//取得指定位置的文件,設(shè)置顯示到播放列表
File home = new File(MUSIC_PATH);
if(home.list(new MusicFilter()).length > 0){
for(File file : home.listFiles(new MusicFilter())){
mMusicList.add(file.getName());
}
ArrayAdapter<String> musicListAdapter = new ArrayAdapter<String>(SDCardMusicPlayActivity.this, R.layout.musicitme, mMusicList);
this.setListAdapter(musicListAdapter);
}
}
private void playMusic(String path){
try {
mMediaPlayer.reset();//重置MediaPlayer
mMediaPlayer.setDataSource(path);//設(shè)置要播放的文件路徑
mMediaPlayer.prepare();//準(zhǔn)備播放
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
nextMusic();//播放完成一首之后進行下一首
}
});
} catch (IOException e) {
// TODO: handle exception
}
}
//下一首
private void nextMusic() {
// TODO Auto-generated method stub
if(++currentListItem >= mMusicList.size()){
currentListItem = 0;
}else{
playMusic(MUSIC_PATH + mMusicList.get(currentListItem));
}
}
//上一首
private void FrontMusic(){
if (--currentListItem >= 0){
currentListItem = mMusicList.size();
}else{
playMusic(MUSIC_PATH + mMusicList.get(currentListItem));
}
}
public boolean onKeyDown(int keyCode, KeyEvent event){
if ( keyCode == KeyEvent.KEYCODE_BACK){
mMediaPlayer.stop();
mMediaPlayer.release();
this.finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
//播放被點擊的音樂
protected void onListItemClick(ListView l, View v, int position, long id){
currentListItem = position;
playMusic(MUSIC_PATH + mMusicList.get(position));
}
}
class MusicFilter implements FilenameFilter{
@Override
public boolean accept(File dir, String filename) {
//這里還可以設(shè)置其他格式的音樂文件
return (filename.endsWith(".mp3"));
}
}
運行效果:
【遇到問題】
在往模擬器的SDCard里放置mp3文件的時候,報:Failed to push selection: Read-only file system 錯誤。
切換到DDMS視圖下,看到mnt下的sdcard文件夾的操作權(quán)限為可讀,后來在AVD Edit的時候,之前SDCard沒設(shè)置大小,所以設(shè)置了大小重新啟動AVD,該sdcard文件夾就可以可以編輯的了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

