Android之MediaPlayer
Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。
MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。
首先我们的播放器可能不只是希望播放一种格式的音乐,而且还需要自动识别指定的路径中哪些是可以播放的音频文件,哪些是不支持的格式,我们可以通过下面的代码来过滤文件类型:
class MusicFilter implements FilenamFilter{ public boolean accept(File dir,String name){ return(name.endWith(".mps3")); }}
现在我们已经得到了能够播放的音频文件,如何来实现一个播放列表的界面呢?本例我们使用ListActivity布局来实现。但是我们还需要几个按钮来表示开始、暂停等操作,我们使用ImageButton来实现,下面是我们的播放器的界面。
现在我们需要指定音乐文件的位置,本例我们设置路径为“/sdcard/”,因此我们需要向SD卡中添加音频文件。步骤如下:启动模拟器,在Eclipse上选择DDMS窗口,选择File Explorer标签,向左、向右箭头分别是拷贝进、拷贝出指定位置,减号则是删除选中的文件。
现在我们只需要设置这些ImageButton按钮的时间来处理相应的动作即可播放音乐,首先调用Reset(),这样做将重置MediaPlayer到它的正常状态,这是必须的。如果正在放一首歌曲,同事又想去改变这个数据源,这个Reset()功能也将停止任何正在播放的歌曲。因此,如果一首歌曲是播放状态,同事我们又要选择另一首歌曲,那么它将在启动下一首歌曲之前停止这首正在播放的歌曲。然后我们通过路径找到这首歌曲(setDataSource(String))同事调用prepare()和Start()。在这里指向MediaPlayer将启动播放你的歌曲。接下来的工作就是去装备一个OnCompletionLister(setOnCompletionListener(newOnCompletionListener())).在歌曲结束的时候,onCompletion(MediaPlayer)这个功能将被调用。比如我们可以在这里设置自动播放下一首歌曲。下面我们老看看具体的实现代码。
package com.yarin.android.Examples_07_01;import java.io.File;import java.io.FilenameFilter;import java.io.IOException;import java.util.ArrayList;import java.util.List;import android.app.ListActivity;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.widget.ArrayAdapter;import android.widget.ImageButton;import android.widget.ListView;public class Activity01 extends ListActivity {/* 几个操作按钮 */private ImageButtonmFrontImageButton= null;private ImageButtonmStopImageButton= null;private ImageButtonmStartImageButton= null;private ImageButtonmPauseImageButton= null;private ImageButtonmNextImageButton= null;/* MediaPlayer对象 */public MediaPlayermMediaPlayer= null;/* 播放列表 */private List<String> mMusicList = new ArrayList<String>();/* 当前播放歌曲的索引 */private int currentListItme = 0;/* 音乐的路径 */private static final String MUSIC_PATH = new String("/sdcard/");/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);/* 更新显示播放列表 */musicList();/* 构建MediaPlayer对象 */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() {@Overridepublic void onClick(View v){/* 是否正在播放 */if (mMediaPlayer.isPlaying()){//重置MediaPlayer到初始状态mMediaPlayer.reset();}}}); //开始按钮mStartImageButton.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View v){playMusic(MUSIC_PATH + mMusicList.get(currentListItme));}}); //暂停mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener() {public void onClick(View view){if (mMediaPlayer.isPlaying()){/* 暂停 */mMediaPlayer.pause();}else {/* 开始播放 */mMediaPlayer.start();}}});//下一首mNextImageButton.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View arg0){nextMusic();}});//上一首mFrontImageButton.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View arg0){FrontMusic();}});}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);}@Override/* 当我们点击列表时,播放被点击的音乐 */protected void onListItemClick(ListView l, View v, int position, long id){currentListItme = position;playMusic(MUSIC_PATH + mMusicList.get(position));}/* 播放列表 */public void musicList(){//取得指定位置的文件设置显示到播放列表File home = new File(MUSIC_PATH);if (home.listFiles(new MusicFilter()).length > 0){for (File file : home.listFiles(new MusicFilter())){mMusicList.add(file.getName());}ArrayAdapter<String> musicList = new ArrayAdapter<String>(Activity01.this,R.layout.musicitme, mMusicList);setListAdapter(musicList);}}private void playMusic(String path){try{/* 重置MediaPlayer */mMediaPlayer.reset();/* 设置要播放的文件的路径 */mMediaPlayer.setDataSource(path);/* 准备播放 */mMediaPlayer.prepare();/* 开始播放 */mMediaPlayer.start();mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {public void onCompletion(MediaPlayer arg0){//播放完成一首之后进行下一首nextMusic();}});}catch (IOException e){}}/* 下一首 */private void nextMusic(){if (++currentListItme >= mMusicList.size()){currentListItme = 0;}else{playMusic(MUSIC_PATH + mMusicList.get(currentListItme));}}/* 上一首 */private void FrontMusic(){if (--currentListItme >= 0){currentListItme = mMusicList.size();}else{playMusic(MUSIC_PATH + mMusicList.get(currentListItme));}}}/* 过滤文件类型 */class MusicFilter implements FilenameFilter{public boolean accept(File dir, String name){//这里还可以设置其他格式的音乐文件return (name.endsWith(".mp3"));}}
现在我们已经知道如何播放指定SD卡上的音乐了,但是大家是否想到,我们在应用时(比如游戏中的音效),肯定是需要和我们的程序一起打包发布的,这样音乐就没有存在于SD卡上了,一般情况下会放在应用的目录下的“res\raw\”中,那么如何播放这样的音乐呢,其实很简单,只需要把上面的例子中的setDataSource 方法改成有create方法来创建一个指定的资源索引的MediaPlayer对象,其他操作基本一。代码如下:
package com.yarin.android.Examples_07_02;import java.io.IOException;import android.app.Activity;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.widget.ImageButton;import android.widget.TextView;public class Activity01 extends Activity{private ImageButtonmStopImageButton;private ImageButtonmStartImageButton;private ImageButtonmPauseImageButton;private TextView mTextView;private booleanbIsReleased= false;private booleanbIsPaused= false;private boolean bIsPlaying= false;public MediaPlayer mMediaPlayer = new MediaPlayer(); ;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton);mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton); mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton);mTextView = (TextView) findViewById(R.id.TextView01); //停止按钮mStopImageButton.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View v){if (bIsPlaying == true){if ( !bIsReleased ){mMediaPlayer.stop();mMediaPlayer.release();bIsReleased = true;}bIsPlaying = false;mTextView.setText("当前处于停止状态,请按开始进行音乐播放!");}}}); //开始按钮mStartImageButton.setOnClickListener(new ImageButton.OnClickListener() {@Overridepublic void onClick(View v){try{if ( !bIsPlaying ){bIsPlaying = true;/* 装载资源中的音乐 */mMediaPlayer = MediaPlayer.create(Activity01.this, R.raw.test);bIsReleased = false;/* 设置是否循环 */mMediaPlayer.setLooping(true);try{mMediaPlayer.prepare();}catch (IllegalStateException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}mMediaPlayer.start();mTextView.setText("当前正在播放音乐!");}}catch (IllegalStateException e){e.printStackTrace();}mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {// @Overridepublic void onCompletion(MediaPlayer arg0){mMediaPlayer.release(); }});}}); //暂停mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener() {public void onClick(View view){if (mMediaPlayer != null){if (bIsReleased == false){if (bIsPaused == false){mMediaPlayer.pause();bIsPaused = true;bIsPlaying = true;mTextView.setText("已经暂停,请再次按暂停按钮回复播放!");}else if (bIsPaused == true){mMediaPlayer.start();bIsPaused = false;mTextView.setText("音乐恢复播放!");}}}}});}public boolean onKeyDown(int keyCode, KeyEvent event){if ( keyCode == KeyEvent.KEYCODE_BACK){if ( !bIsReleased ){mMediaPlayer.stop();mMediaPlayer.release();bIsReleased = true;}this.finish();return true;}return super.onKeyDown(keyCode, event);}}
细心的读者已经发现create方法不仅可以加载应用程序中资源的索引,还可加载一个URI地址,当然这就说明我们同样可以很轻松地播放网络音乐,核心代码如下:
Private MediaPlayer mMediaPlayer;Uri uri=Uri.parse("http://www.xxx.com.xxx.mp3");mMediaPlayer=MediaPlayer.create(this,uri);mMediaPlayer.start();
更多相关文章
- android 按钮设计中state_selected属性
- android中使用MediaPlayer播放视频
- 【Android经典入门教程-下(bill译)】
- Android(安卓)SDK 2.2 开发环境搭建
- Android(安卓)SDK 2.2 开发环境搭建
- Android和js、H5进行交互数据
- Android网络收音机项目
- Android开发板之串口开发
- 我的Android音乐播放器