`

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

 

    

分享到:
评论
1 楼 fx_199182 2013-01-25  

相关推荐

    Android 使用MediaPlayer播放视频

    `MediaPlayer`是Android SDK提供的一种核心组件,专门用于播放音频和视频文件。在这个场景中,我们将详细探讨如何使用`MediaPlayer`来播放视频,同时结合`SurfaceView`来显示视频画面。本文将深入解析相关知识点,并...

    Android实例之MediaPlayer播放音乐和视频

    在这个"Android实例之MediaPlayer播放音乐和视频"中,我们将深入探讨如何利用MediaPlayer类实现多媒体的播放功能。 首先,MediaPlayer是Android SDK提供的一个类,它可以播放本地或网络上的音频和视频资源。在...

    Android应用开发mediaplayer播放音频,带有进度条

    在Android应用开发中,MediaPlayer类是用于播放各种音频和视频资源的核心组件。在这个特定的示例中,我们关注的是如何使用MediaPlayer与进度条(SeekBar)结合,创建一个简单的音频播放器。以下是对这个Android应用...

    Android MediaPlayer 自定义循环次数

    在Android开发中,MediaPlayer是处理音频和视频播放的核心类之一,它提供了丰富的API来控制多媒体文件的播放。本文将深入探讨如何使用MediaPlayer自定义循环播放的次数,这在需要重复播放特定音频片段的应用场景中...

    android MediaPlayer+SurfaceView实现播放

    在Android开发中,多媒体播放是常见的功能之一,`MediaPlayer` 和 `SurfaceView` 的结合使用是实现视频播放的标准方式。本篇文章将详细讲解如何利用这两个组件来构建一个视频播放器。 首先,`MediaPlayer` 是...

    android-mediaplayer_android源码_

    `MediaPlayer`类是Android SDK中的核心组件之一,它允许开发者播放本地或网络上的媒体文件。这个类提供了丰富的API,包括播放、暂停、停止、SeekTo(定位播放位置)等操作。`MediaPlayer`的工作流程通常涉及以下几个...

    Android下MediaPlayer播放MP3示例

    在Android平台上,`MediaPlayer`是系统提供的一个核心组件,用于播放音频和视频文件。这个组件支持多种媒体格式,包括MP3。在这个示例中,我们将深入探讨如何使用`MediaPlayer`来播放MP3文件。 首先,我们需要了解`...

    Android MediaPlayer播放mp3的实例.doc

    "Android MediaPlayer播放mp3的实例" Android 中的 MediaPlayer 是一个功能强大且复杂的媒体播放器,可以播放音频和视频文件。在 Android 的界面上,Music 和 Video 两个应用程序都是调用 MediaPlayer 实现的。...

    Android的MediaPlayer架构介绍

    ### Android的MediaPlayer架构详细介绍 #### 一、MediaPlayer概述 Android平台上的`MediaPlayer`是一个非常重要的组件,用于处理音频和视频的播放任务。无论是系统自带的音乐播放器还是视频播放器应用,都依赖于`...

    Android 使用MediaPlayer高级

    在Android平台上,`MediaPlayer`是系统提供的一个核心组件,用于播放各种媒体文件,如音频和视频。本篇文章将深入探讨`MediaPlayer`的高级用法,包括但不限于事件处理、流媒体播放、音量控制以及错误处理等方面。...

    Android 使用MediaPlayer播放assets或者raw目录的音频文件

    Android 使用MediaPlayer播放assets或者raw目录的音频文件 https://blog.csdn.net/qq_31939617/article/details/80491552

    Android 使用mediaplayer播放res/raw文件夹中的音乐的实例

    Android 使用mediaplayer播放res/raw文件夹中的音乐的实例 (1)在res文件夹中新建一个文件夹重命名为raw,并且将要播放的音乐放到raw文件夹里面 (2)修改layout目录下的xml布局文件,添加3个按钮空间和一个文本...

    Android MediaPlayer研究问题

    在Android开发中,MediaPlayer是一个非常重要的组件,它用于播放各种媒体资源,如音频和视频文件。这个组件在处理多媒体内容时提供了丰富的功能,但同时也伴随着一些常见问题和挑战。这篇博客"Android MediaPlayer...

    android自定义MediaPlayer视频播放器,兼容各种视频类型播放。解决视频加载不出来黑屏问题。

    自定义MediaPlayer视频播放器,兼容各种视频类型播放。解决视频加载不出来黑屏问题。

    android的MediaPlayer播放器迷你案例

    在Android平台上,多媒体内容的播放任务通常由`MediaPlayer`类来处理。`MediaPlayer`是一个强大的API,用于播放音频和视频文件以及网络流媒体。在这个迷你案例中,我们将深入探讨如何使用`MediaPlayer`来实现基本的...

    android MediaPlayer播放视频网络URL,asset目录下文件,本地视频文件

    在Android开发中,`MediaPlayer`类是用于播放各种媒体文件的核心组件。它可以处理音频、视频流,支持多种格式,如MP3、AAC、MPEG-4等。在本教程中,我们将深入探讨如何使用`MediaPlayer`播放网络URL、Asset目录下的...

    玩转 Android MediaPlayer之视频预加载(优化)

    总的来说,"玩转 Android MediaPlayer之视频预加载(优化)"是关于如何在Android平台上利用MediaPlayer组件,结合网络条件、硬件能力、错误处理等多个方面,实现视频的高效预加载,提升播放体验的技术探讨。...

    MediaPlayer(Android音视频播放器)

    **Android的MediaPlayer是Android系统提供的一种用于播放音频和视频的基础组件。它支持多种媒体格式,如MP3、AAC、MP4等,并且可以利用硬件解码能力,提高播放效率。在Android开发中,掌握MediaPlayer的使用是十分...

    Android 中级教程之------Android MediaPlayer播放mp3的实例

    在Android开发中,MediaPlayer是一个非常重要的组件,它用于播放各种媒体资源,如音频和视频文件。本教程将深入探讨如何使用Android的MediaPlayer类来播放MP3格式的音频文件。了解这个知识点对于Android开发者来说至...

Global site tag (gtag.js) - Google Analytics