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();

更多相关文章

  1. android 按钮设计中state_selected属性
  2. android中使用MediaPlayer播放视频
  3. 【Android经典入门教程-下(bill译)】
  4. Android(安卓)SDK 2.2 开发环境搭建
  5. Android(安卓)SDK 2.2 开发环境搭建
  6. Android和js、H5进行交互数据
  7. Android网络收音机项目
  8. Android开发板之串口开发
  9. 我的Android音乐播放器

随机推荐

  1. Android SharedPreferences和File
  2. android中SharedPreferences和Preference
  3. ANDROID模拟器不能启动
  4. android实现开机欢迎界面
  5. 【学习笔记】android基本环境
  6. android线程调度工具类SchedulerUtils
  7. Andriod(3)——Understanding Android(安
  8. Android实现系统重新启动
  9. Android常用的技术点
  10. Android中设置TextView的颜色setTextColo