【android学习之十四】——多媒体1:音乐播放

 声明:学习的书籍《Android应用开发揭秘》,这里记录学习该书籍的日志,引用的相关代码与总结描述,没有商业的用途,完全是自我学习的一个记录,刚刚学习不可避免会出现很多问题,若是有错误还请大家多多批评。

今天开始学习多媒体相关的操作,因为我们的智能手机一部分重要的作用就是播放音频,视频,显示图片等操作。Android主要是通过Open Core作为多媒体框架的核心,也被称作为PV,支持多种格式的音频,视频。Open Core框架主要包含两部分:

(1)       PVPlayer:提供媒体播放器功能。

(2)       PVAuthor:提供媒体流记录的功能,完成各种音频,视频的流以及图像的捕捉功能。

当然我们开发中,不会直接操作底层的PV,主要使用Android提供的Media API。

 

1.       MediaPlayer类

该类主要用来播放,音频,视频和流媒体,包含了Audio和Video的播放功能,具体的生命周期与相关方法,可以参考下面音乐播放实例。

2.       MediaRecorder类

该类主要用于媒体的采样,包括音频视频。MediaRecorder作为状态机运行,需要设置不同的,比如源设备和格式。设置后,可以执行任何时间长度的录制,直到用户停止。

 

一、多媒体之音乐播放

下面就以音乐播放的例子来验证MediaPlayer的生命周期以及相关方法,关于音乐播放其实之前例子已经实现,当时是播放的raw目录下得mp3文件,本例子自动播放SDCard下的mp3例子。

关键源码:

public class SDCardMusicPlayActivity extends ListActivity {
	private ImageButton mFrontImageButton = null;
	private ImageButton	mStopImageButton	= null;
	private ImageButton	mStartImageButton	= null;
	private ImageButton	mPauseImageButton	= null;
	private ImageButton	mNextImageButton	= null;
	
	public MediaPlayer mMediaPlayer = null;		//MediaPlayer对象
	private List<String> mMusicList = new ArrayList<String>();//播放列表
	private int currentListItem = 0;			//当前播放歌曲的索引
	private static final String MUSIC_PATH = new String("/mnt/sdcard/");//音乐的路径

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        musicList();							//更新显示播放列表
        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() {
			public void onClick(View v) {
				if(mMediaPlayer.isPlaying()){	//当前是否正在播放
					mMediaPlayer.reset();		//重置MediaPlayer到初始状态
				}
			}
		});
		//开始按钮
		mStartImageButton.setOnClickListener(new ImageButton.OnClickListener() {
			public void onClick(View v) {
				playMusic(MUSIC_PATH + mMusicList.get(currentListItem));
			}
		});
		//暂停按钮
		mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener() {
			public void onClick(View v) {
				if(mMediaPlayer.isPlaying()){
					mMediaPlayer.pause();
				}else{
					mMediaPlayer.start();
				}
			}
		});
		//下一首
		mNextImageButton.setOnClickListener(new ImageButton.OnClickListener() {
			public void onClick(View arg0){
				nextMusic();
			}
		});
		//上一首
		mFrontImageButton.setOnClickListener(new ImageButton.OnClickListener() {
			public void onClick(View arg0){
				FrontMusic();
			}
		});
    }

    //播放列表
	private void musicList() {
		//取得指定位置的文件,设置显示到播放列表
		File home = new File(MUSIC_PATH);
		if(home.list(new MusicFilter()).length > 0){
			for(File file : home.listFiles(new MusicFilter())){
				mMusicList.add(file.getName());
			}
			ArrayAdapter<String> musicListAdapter = new ArrayAdapter<String>(SDCardMusicPlayActivity.this, R.layout.musicitme, mMusicList);
			this.setListAdapter(musicListAdapter);
		}
	}
	
	private void playMusic(String path){
		try {
			mMediaPlayer.reset();//重置MediaPlayer
			mMediaPlayer.setDataSource(path);//设置要播放的文件路径
			mMediaPlayer.prepare();//准备播放
			mMediaPlayer.start();
			mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
				public void onCompletion(MediaPlayer mp) {
					// TODO Auto-generated method stub
					nextMusic();//播放完成一首之后进行下一首
				}
			});
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
	
	//下一首
	private void nextMusic() {
		// TODO Auto-generated method stub
		if(++currentListItem >= mMusicList.size()){
			currentListItem = 0;
		}else{
			playMusic(MUSIC_PATH + mMusicList.get(currentListItem));
		}
	}
	
	//上一首 
	private void FrontMusic(){
		if (--currentListItem >= 0){
			currentListItem = mMusicList.size();
		}else{
			playMusic(MUSIC_PATH + mMusicList.get(currentListItem));
		}
	}
	
	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);
	}
	
	//播放被点击的音乐 
	protected void onListItemClick(ListView l, View v, int position, long id){
		currentListItem = position;
		playMusic(MUSIC_PATH + mMusicList.get(position));
	}

}

class MusicFilter implements FilenameFilter{

	@Override
	public boolean accept(File dir, String filename) {
		//这里还可以设置其他格式的音乐文件
		return (filename.endsWith(".mp3"));
	}
	
}

运行效果:



【遇到问题】

在往模拟器的SDCard里放置mp3文件的时候,报:Failed to push selection: Read-only file system 错误。

切换到DDMS视图下,看到mnt下的sdcard文件夹的操作权限为可读,后来在AVD Edit的时候,之前SDCard没设置大小,所以设置了大小重新启动AVD,该sdcard文件夹就可以可以编辑的了。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值