网站策划案范文如何推广品牌知名度
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 ImageButton mFrontImageButton = null;
 - private ImageButton mStopImageButton = null;
 - private ImageButton mStartImageButton = null;
 - private ImageButton mPauseImageButton = null;
 - private ImageButton mNextImageButton = null;
 - /* MediaPlayer对象 */
 - public MediaPlayer mMediaPlayer = 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. */
 - @Override
 - public 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()
 - {
 - @Override
 - public void onClick(View v)
 - {
 - /* 是否正在播放 */
 - if (mMediaPlayer.isPlaying())
 - {
 - //重置MediaPlayer到初始状态
 - mMediaPlayer.reset();
 - }
 - }
 - });
 - //开始按钮
 - mStartImageButton.setOnClickListener(new ImageButton.OnClickListener()
 - {
 - @Override
 - public 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()
 - {
 - @Override
 - public void onClick(View arg0)
 - {
 - nextMusic();
 - }
 - });
 - //上一首
 - mFrontImageButton.setOnClickListener(new ImageButton.OnClickListener()
 - {
 - @Override
 - public 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 ImageButton mStopImageButton;
 - private ImageButton mStartImageButton;
 - private ImageButton mPauseImageButton;
 - private TextView mTextView;
 - private boolean bIsReleased = false;
 - private boolean bIsPaused = false;
 - private boolean bIsPlaying = false;
 - public MediaPlayer mMediaPlayer = new MediaPlayer(); ;
 - /** Called when the activity is first created. */
 - @Override
 - public 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()
 - {
 - @Override
 - public void onClick(View v)
 - {
 - if (bIsPlaying == true)
 - {
 - if ( !bIsReleased )
 - {
 - mMediaPlayer.stop();
 - mMediaPlayer.release();
 - bIsReleased = true;
 - }
 - bIsPlaying = false;
 - mTextView.setText("当前处于停止状态,请按开始进行音乐播放!");
 - }
 - }
 - });
 - //开始按钮
 - mStartImageButton.setOnClickListener(new ImageButton.OnClickListener()
 - {
 - @Override
 - public 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()
 - {
 - // @Override
 - public 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(); 
 

