聲明:學習的書籍《Android應用開發揭秘》,這里記錄學習該書籍的日志,引用的相關代碼與總結描述,沒有商業的用途,完全是自我學習的一個記錄,剛剛學習不可避免會出現很多問題,若是有錯誤還請大家多多批評。
今天開始學習多媒體相關的操作,因為我們的智能手機一部分重要的作用就是播放音頻,視頻,顯示圖片等操作。Android主要是通過Open Core作為多媒體框架的核心,也被稱作為PV,支持多種格式的音頻,視頻。Open Core框架主要包含兩部分:
(1) PVPlayer:提供媒體播放器功能。
(2) PVAuthor:提供媒體流記錄的功能,完成各種音頻,視頻的流以及圖像的捕捉功能。
當然我們開發中,不會直接操作底層的PV,主要使用Android提供的Media API。
1. MediaPlayer類
該類主要用來播放,音頻,視頻和流媒體,包含了Audio和Video的播放功能,具體的生命周期與相關方法,可以參考下面音樂播放實例。
2. MediaRecorder類
該類主要用于媒體的采樣,包括音頻視頻。MediaRecorder作為狀態機運行,需要設置不同的,比如源設備和格式。設置后,可以執行任何時間長度的錄制,直到用戶停止。
一、多媒體之音樂播放
下面就以音樂播放的例子來驗證MediaPlayer的生命周期以及相關方法,關于音樂播放其實之前例子已經實現,當時是播放的raw目錄下得mp3文件,本例子自動播放SDCard下的mp3例子。
關鍵源碼:
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; //當前播放歌曲的索引 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()){ //當前是否正在播放 mMediaPlayer.reset(); //重置MediaPlayer到初始狀態 } } }); //開始按鈕 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() { //取得指定位置的文件,設置顯示到播放列表 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);//設置要播放的文件路徑 mMediaPlayer.prepare();//準備播放 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) { //這里還可以設置其他格式的音樂文件 return (filename.endsWith(".mp3")); } }
運行效果:
【遇到問題】
在往模擬器的SDCard里放置mp3文件的時候,報:Failed to push selection: Read-only file system 錯誤。
切換到DDMS視圖下,看到mnt下的sdcard文件夾的操作權限為可讀,后來在AVD Edit的時候,之前SDCard沒設置大小,所以設置了大小重新啟動AVD,該sdcard文件夾就可以可以編輯的了。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
