Android应用开发--MP3音乐播放器代码实现

Posted IT_xiao小巫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android应用开发--MP3音乐播放器代码实现相关的知识,希望对你有一定的参考价值。

android应用开发--MP3音乐播放器代码实现(一)


需求1:将内存卡中的MP3音乐读取出来并显示到列表当中

1.   从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3Info对象
2.   迭代List集合,把每一个Mp3Info对象的所有属性,保存到Map对象当中
3.   定义一个List集合,把Map对象添加到List集合当中
4.   通过定义一个SimpleAdpter,调用setAdpter方法,将数据显示到列表当中

/**
* 用于从数据库中查询歌曲的信息,保存在List当中
*
* @return
*/
public List<Mp3Info> getMp3Infos() 
	Cursor cursor = getContentResolver().query(
		MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
		MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
	List<Mp3Info> mp3Infos = new ArrayList<Mp3Info>();
	for (int i = 0; i < cursor.getCount(); i++) 
		Mp3Info mp3Info = new Mp3Info();
		cursor.moveToNext();
		long id = cursor.getLong(cursor
			.getColumnIndex(MediaStore.Audio.Media._ID));	//音乐id
		String title = cursor.getString((cursor	
			.getColumnIndex(MediaStore.Audio.Media.TITLE)));//音乐标题
		String artist = cursor.getString(cursor
			.getColumnIndex(MediaStore.Audio.Media.ARTIST));//艺术家
		long duration = cursor.getLong(cursor
			.getColumnIndex(MediaStore.Audio.Media.DURATION));//时长
		long size = cursor.getLong(cursor
			.getColumnIndex(MediaStore.Audio.Media.SIZE));	//文件大小
		String url = cursor.getString(cursor
			.getColumnIndex(MediaStore.Audio.Media.DATA));				//文件路径
	int isMusic = cursor.getInt(cursor
		.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));//是否为音乐
	if (isMusic != 0) 		//只把音乐添加到集合当中
		mp3Info.setId(id);
		mp3Info.setTitle(title);
		mp3Info.setArtist(artist);
		mp3Info.setDuration(duration);
		mp3Info.setSize(size);
		mp3Info.setUrl(url);
		mp3Infos.add(mp3Info);
		
	
return mp3Infos;


/**
	 * 填充列表
	 * @param mp3Infos
	 */
	public void setListAdpter(List<Mp3Info> mp3Infos) 
		List<HashMap<String, String>> mp3list = new ArrayList<HashMap<String, String>>();
		for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) 
			Mp3Info mp3Info = (Mp3Info) iterator.next();
			HashMap<String, String> map = new HashMap<String, String>();
			map.put("title", mp3Info.getTitle());
			map.put("Artist", mp3Info.getArtist());
			map.put("duration", String.valueOf(mp3Info.getDuration()));
			map.put("size", String.valueOf(mp3Info.getSize()));
			map.put("url", mp3Info.getUrl());
			mp3list.add(map);
		
		mAdapter = new SimpleAdapter(this, mp3list,
				R.layout.music_list_item_layout, new String[]  "title", "Artist", "duration" ,
				new int[]  R.id.music_title, R.id.music_Artist, R.id.music_duration );
		mMusiclist.setAdapter(mAdapter);	
	

实现效果如图:

   



需求2:点击列表的每一项,启动一个服务来播放音乐

1.   注册条目点击监听器OnItemClickListener

2.   定义一个实现OnItemClickListener接口的内部类

3.   定义一个继承Service的服务类PlayerServie



1.   注册条目点击监听器OnItemClickListener

mMusiclist = (ListView) findViewById(R.id.music_list);
		mMusiclist.setOnItemClickListener(new MusicListItemClickListener());
		mp3Infos = getMp3Infos();
		setListAdpter(getMp3Infos());


2.   定义一个实现OnItemClickListener接口的内部类
private class MusicListItemClickListener implements OnItemClickListener 
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) 
		if(mp3Infos != null) 
			Mp3Info mp3Info = mp3Infos.get(position);
			Log.d("mp3Info-->", mp3Info.toString());
			Intent intent = new Intent();
			intent.putExtra("url", mp3Info.getUrl());		
			intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);
			intent.setClass(MainActivity.this, PlayerService.class);
			startService(intent);		//启动服务
		
	



3.   定义一个继承Service的服务类PlayerServie(未完善的Service类)

package com.wwj.sb.service;


import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.IBinder;

import com.wwj.sb.domain.AppConstant;

@SuppressLint("NewApi")
public class PlayerService extends Service 
	private MediaPlayer mediaPlayer =  new MediaPlayer();		//媒体播放器对象
	private String path;						//音乐文件路径
	private boolean isPause;					//暂停状态
	
	@Override
	public IBinder onBind(Intent arg0) 
		return null;
	
	
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) 
		if(mediaPlayer.isPlaying()) 
			stop();
		
		path = intent.getStringExtra("url");		
		int msg = intent.getIntExtra("MSG", 0);
		if(msg == AppConstant.PlayerMsg.PLAY_MSG) 
			play(0);
		 else if(msg == AppConstant.PlayerMsg.PAUSE_MSG) 
			pause();
		 else if(msg == AppConstant.PlayerMsg.STOP_MSG) 
			stop();
		
		return super.onStartCommand(intent, flags, startId);
	
	

	/**
	 * 播放音乐
	 * @param position
	 */
	private void play(int position) 
		try 
			mediaPlayer.reset();//把各项参数恢复到初始状态
			mediaPlayer.setDataSource(path);
			mediaPlayer.prepare();	//进行缓冲
			mediaPlayer.setOnPreparedListener(new PreparedListener(position));//注册一个监听器
		
		catch (Exception e) 
			e.printStackTrace();
		
	
	
	/**
	 * 暂停音乐
	 */
	private void pause() 
		if (mediaPlayer != null && mediaPlayer.isPlaying()) 
			mediaPlayer.pause();
			isPause = true;
		
	
	
	/**
	 * 停止音乐
	 */
	private void stop()
		if(mediaPlayer != null) 
			mediaPlayer.stop();
			try 
				mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数
			 catch (Exception e) 
				e.printStackTrace();
			
		
	
	
	
	@Override
	public void onDestroy() 
		if(mediaPlayer != null)
			mediaPlayer.stop();
			mediaPlayer.release();
		
	
	/**
	 * 
	 * 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放
	 *
	 */
	private final class PreparedListener implements OnPreparedListener 
		private int positon;
		
		public PreparedListener(int positon) 
			this.positon = positon;
		
		
		@Override
		public void onPrepared(MediaPlayer mp) 
			mediaPlayer.start();	//开始播放
			if(positon > 0) 	//如果音乐不是从头播放
				mediaPlayer.seekTo(positon);
			
		
	
	



以上代码实现了两个需求,显示音乐列表和实现列表点击事件启动Servic。下次会实现控制音乐播放的需求。



以上是关于Android应用开发--MP3音乐播放器代码实现的主要内容,如果未能解决你的问题,请参考以下文章

Android开发本地及网络Mp3音乐播放器(十八)新下载歌曲加载准备SdcardSearchToList

Android应用开发--MP3音乐播放器界面设计

android - 如何在我的音乐播放器中从文件管理器播放 mp3 文件?

Android命令行播放MP3音乐

linux虚拟机下bash shell编程,制作一个音乐播放器,可以实现用代码打开mp3文件吗?

第三次作业