Android之MediaPlayer
MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。
首先我们的播放器可能不只是希望播放一种格式的音乐,而且还需要自动识别指定的路径中哪些是可以播放的音频文件,哪些是不支持的格式,我们可以通过下面的代码来过滤文件类型:
Java代码- classMusicFilterimplementsFilenamFilter{
- publicbooleanaccept(Filedir,Stringname){
- 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)这个功能将被调用。比如我们可以在这里设置自动播放下一首歌曲。下面我们老看看具体的实现代码。
Java代码- packagecom.yarin.android.Examples_07_01;
- importjava.io.File;
- importjava.io.FilenameFilter;
- importjava.io.IOException;
- importjava.util.ArrayList;
- importjava.util.List;
- importandroid.app.ListActivity;
- importandroid.media.MediaPlayer;
- importandroid.media.MediaPlayer.OnCompletionListener;
- importandroid.os.Bundle;
- importandroid.view.KeyEvent;
- importandroid.view.View;
- importandroid.widget.ArrayAdapter;
- importandroid.widget.ImageButton;
- importandroid.widget.ListView;
- publicclassActivity01extendsListActivity
- {
- /*几个操作按钮*/
- privateImageButtonmFrontImageButton=null;
- privateImageButtonmStopImageButton=null;
- privateImageButtonmStartImageButton=null;
- privateImageButtonmPauseImageButton=null;
- privateImageButtonmNextImageButton=null;
- /*MediaPlayer对象*/
- publicMediaPlayermMediaPlayer=null;
- /*播放列表*/
- privateList<String>mMusicList=newArrayList<String>();
- /*当前播放歌曲的索引*/
- privateintcurrentListItme=0;
- /*音乐的路径*/
- privatestaticfinalStringMUSIC_PATH=newString("/sdcard/");
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- /*更新显示播放列表*/
- musicList();
- /*构建MediaPlayer对象*/
- mMediaPlayer=newMediaPlayer();
- 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(newImageButton.OnClickListener()
- {
- @Override
- publicvoidonClick(Viewv)
- {
- /*是否正在播放*/
- if(mMediaPlayer.isPlaying())
- {
- //重置MediaPlayer到初始状态
- mMediaPlayer.reset();
- }
- }
- });
- //开始按钮
- mStartImageButton.setOnClickListener(newImageButton.OnClickListener()
- {
- @Override
- publicvoidonClick(Viewv)
- {
- playMusic(MUSIC_PATH+mMusicList.get(currentListItme));
- }
- });
- //暂停
- mPauseImageButton.setOnClickListener(newImageButton.OnClickListener()
- {
- publicvoidonClick(Viewview)
- {
- if(mMediaPlayer.isPlaying())
- {
- /*暂停*/
- mMediaPlayer.pause();
- }
- else
- {
- /*开始播放*/
- mMediaPlayer.start();
- }
- }
- });
- //下一首
- mNextImageButton.setOnClickListener(newImageButton.OnClickListener()
- {
- @Override
- publicvoidonClick(Viewarg0)
- {
- nextMusic();
- }
- });
- //上一首
- mFrontImageButton.setOnClickListener(newImageButton.OnClickListener()
- {
- @Override
- publicvoidonClick(Viewarg0)
- {
- FrontMusic();
- }
- });
- }
- publicbooleanonKeyDown(intkeyCode,KeyEventevent)
- {
- if(keyCode==KeyEvent.KEYCODE_BACK)
- {
- mMediaPlayer.stop();
- mMediaPlayer.release();
- this.finish();
- returntrue;
- }
- returnsuper.onKeyDown(keyCode,event);
- }
- @Override
- /*当我们点击列表时,播放被点击的音乐*/
- protectedvoidonListItemClick(ListViewl,Viewv,intposition,longid)
- {
- currentListItme=position;
- playMusic(MUSIC_PATH+mMusicList.get(position));
- }
- /*播放列表*/
- publicvoidmusicList()
- {
- //取得指定位置的文件设置显示到播放列表
- Filehome=newFile(MUSIC_PATH);
- if(home.listFiles(newMusicFilter()).length>0)
- {
- for(Filefile:home.listFiles(newMusicFilter()))
- {
- mMusicList.add(file.getName());
- }
- ArrayAdapter<String>musicList=newArrayAdapter<String>(Activity01.this,R.layout.musicitme,mMusicList);
- setListAdapter(musicList);
- }
- }
- privatevoidplayMusic(Stringpath)
- {
- try
- {
- /*重置MediaPlayer*/
- mMediaPlayer.reset();
- /*设置要播放的文件的路径*/
- mMediaPlayer.setDataSource(path);
- /*准备播放*/
- mMediaPlayer.prepare();
- /*开始播放*/
- mMediaPlayer.start();
- mMediaPlayer.setOnCompletionListener(newOnCompletionListener()
- {
- publicvoidonCompletion(MediaPlayerarg0)
- {
- //播放完成一首之后进行下一首
- nextMusic();
- }
- });
- }catch(IOExceptione){}
- }
- /*下一首*/
- privatevoidnextMusic()
- {
- if(++currentListItme>=mMusicList.size())
- {
- currentListItme=0;
- }
- else
- {
- playMusic(MUSIC_PATH+mMusicList.get(currentListItme));
- }
- }
- /*上一首*/
- privatevoidFrontMusic()
- {
- if(--currentListItme>=0)
- {
- currentListItme=mMusicList.size();
- }
- else
- {
- playMusic(MUSIC_PATH+mMusicList.get(currentListItme));
- }
- }
- }
- /*过滤文件类型*/
- classMusicFilterimplementsFilenameFilter
- {
- publicbooleanaccept(Filedir,Stringname)
- {
- //这里还可以设置其他格式的音乐文件
- return(name.endsWith(".mp3"));
- }
- }
现在我们已经知道如何播放指定SD卡上的音乐了,但是大家是否想到,我们在应用时(比如游戏中的音效),肯定是需要和我们的程序一起打包发布的,这样音乐就没有存在于SD卡上了,一般情况下会放在应用的目录下的“res\raw\”中,那么如何播放这样的音乐呢,其实很简单,只需要把上面的例子中的setDataSource 方法改成有create方法来创建一个指定的资源索引的MediaPlayer对象,其他操作基本一。代码如下:
Java代码- packagecom.yarin.android.Examples_07_02;
- importjava.io.IOException;
- importandroid.app.Activity;
- importandroid.media.MediaPlayer;
- importandroid.media.MediaPlayer.OnCompletionListener;
- importandroid.os.Bundle;
- importandroid.view.KeyEvent;
- importandroid.view.View;
- importandroid.widget.ImageButton;
- importandroid.widget.TextView;
- publicclassActivity01extendsActivity
- {
- privateImageButtonmStopImageButton;
- privateImageButtonmStartImageButton;
- privateImageButtonmPauseImageButton;
- privateTextViewmTextView;
- privatebooleanbIsReleased=false;
- privatebooleanbIsPaused=false;
- privatebooleanbIsPlaying=false;
- publicMediaPlayermMediaPlayer=newMediaPlayer();;
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState)
- {
- 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(newImageButton.OnClickListener()
- {
- @Override
- publicvoidonClick(Viewv)
- {
- if(bIsPlaying==true)
- {
- if(!bIsReleased)
- {
- mMediaPlayer.stop();
- mMediaPlayer.release();
- bIsReleased=true;
- }
- bIsPlaying=false;
- mTextView.setText("当前处于停止状态,请按开始进行音乐播放!");
- }
- }
- });
- //开始按钮
- mStartImageButton.setOnClickListener(newImageButton.OnClickListener()
- {
- @Override
- publicvoidonClick(Viewv)
- {
- try
- {
- if(!bIsPlaying)
- {
- bIsPlaying=true;
- /*装载资源中的音乐*/
- mMediaPlayer=MediaPlayer.create(Activity01.this,R.raw.test);
- bIsReleased=false;
- /*设置是否循环*/
- mMediaPlayer.setLooping(true);
- try
- {
- mMediaPlayer.prepare();
- }
- catch(IllegalStateExceptione)
- {
- e.printStackTrace();
- }
- catch(IOExceptione)
- {
- e.printStackTrace();
- }
- mMediaPlayer.start();
- mTextView.setText("当前正在播放音乐!");
- }
- }
- catch(IllegalStateExceptione)
- {
- e.printStackTrace();
- }
- mMediaPlayer.setOnCompletionListener(newOnCompletionListener()
- {
- //@Override
- publicvoidonCompletion(MediaPlayerarg0)
- {
- mMediaPlayer.release();
- }
- });
- }
- });
- //暂停
- mPauseImageButton.setOnClickListener(newImageButton.OnClickListener()
- {
- publicvoidonClick(Viewview)
- {
- if(mMediaPlayer!=null)
- {
- if(bIsReleased==false)
- {
- if(bIsPaused==false)
- {
- mMediaPlayer.pause();
- bIsPaused=true;
- bIsPlaying=true;
- mTextView.setText("已经暂停,请再次按暂停按钮回复播放!");
- }
- elseif(bIsPaused==true)
- {
- mMediaPlayer.start();
- bIsPaused=false;
- mTextView.setText("音乐恢复播放!");
- }
- }
- }
- }
- });
- }
- publicbooleanonKeyDown(intkeyCode,KeyEventevent)
- {
- if(keyCode==KeyEvent.KEYCODE_BACK)
- {
- if(!bIsReleased)
- {
- mMediaPlayer.stop();
- mMediaPlayer.release();
- bIsReleased=true;
- }
- this.finish();
- returntrue;
- }
- returnsuper.onKeyDown(keyCode,event);
- }
- }
细心的读者已经发现create方法不仅可以加载应用程序中资源的索引,还可加载一个URI地址,当然这就说明我们同样可以很轻松地播放网络音乐,核心代码如下:
Java代码- PrivateMediaPlayermMediaPlayer;
- Uriuri=Uri.parse("http://www.xxx.com.xxx.mp3");
- mMediaPlayer=MediaPlayer.create(this,uri);
- mMediaPlayer.start();
更多相关文章
- Android中音乐文件的信息详解【安卓源码解析二】
- VLC Android播放器介绍
- Android(安卓)ToggleButton Example--开关按钮
- Android仿印象笔记的自定义菜单控件
- android 按钮设计中state_selected属性
- Android(安卓)Studio如何删除module
- 剖析Android自带Widget-Music播放器
- android EditText imeOptions属性和各属性setOnEditorActionList
- android 按钮设计中state_selected属性