android小项目之音乐播放器二分析

熊孩纸 阅读:286 2021-03-31 23:33:41 评论:0


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


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

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

  1. /** 
  2. * 用于从数据库中查询歌曲的信息,保存在List当中 
  3. * 
  4. * @return 
  5. */  
  6. public List<Mp3Info> getMp3Infos() {  
  7.     Cursor cursor = getContentResolver().query(  
  8.         MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, nullnullnull,  
  9.         MediaStore.Audio.Media.DEFAULT_SORT_ORDER);  
  10.     List<Mp3Info> mp3Infos = new ArrayList<Mp3Info>();  
  11.     for (int i = 0; i < cursor.getCount(); i++) {  
  12.         Mp3Info mp3Info = new Mp3Info();  
  13.         cursor.moveToNext();  
  14.         long id = cursor.getLong(cursor  
  15.             .getColumnIndex(MediaStore.Audio.Media._ID));   //音乐id  
  16.         String title = cursor.getString((cursor   
  17.             .getColumnIndex(MediaStore.Audio.Media.TITLE)));//音乐标题  
  18.         String artist = cursor.getString(cursor  
  19.             .getColumnIndex(MediaStore.Audio.Media.ARTIST));//艺术家  
  20.         long duration = cursor.getLong(cursor  
  21.             .getColumnIndex(MediaStore.Audio.Media.DURATION));//时长  
  22.         long size = cursor.getLong(cursor  
  23.             .getColumnIndex(MediaStore.Audio.Media.SIZE));  //文件大小  
  24.         String url = cursor.getString(cursor  
  25.             .getColumnIndex(MediaStore.Audio.Media.DATA));              //文件路径  
  26.     int isMusic = cursor.getInt(cursor  
  27.         .getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));//是否为音乐  
  28.     if (isMusic != 0) {     //只把音乐添加到集合当中  
  29.         mp3Info.setId(id);  
  30.         mp3Info.setTitle(title);  
  31.         mp3Info.setArtist(artist);  
  32.         mp3Info.setDuration(duration);  
  33.         mp3Info.setSize(size);  
  34.         mp3Info.setUrl(url);  
  35.         mp3Infos.add(mp3Info);  
  36.         }  
  37.     }  
  38. return mp3Infos;  
  39. }  
/** 
* 用于从数据库中查询歌曲的信息,保存在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; 
} 

  1. /** 
  2.      * 填充列表 
  3.      * @param mp3Infos 
  4.      */  
  5.     public void setListAdpter(List<Mp3Info> mp3Infos) {  
  6.         List<HashMap<String, String>> mp3list = new ArrayList<HashMap<String, String>>();  
  7.         for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {  
  8.             Mp3Info mp3Info = (Mp3Info) iterator.next();  
  9.             HashMap<String, String> map = new HashMap<String, String>();  
  10.             map.put("title", mp3Info.getTitle());  
  11.             map.put("Artist", mp3Info.getArtist());  
  12.             map.put("duration", String.valueOf(mp3Info.getDuration()));  
  13.             map.put("size", String.valueOf(mp3Info.getSize()));  
  14.             map.put("url", mp3Info.getUrl());  
  15.             mp3list.add(map);  
  16.         }  
  17.         mAdapter = new SimpleAdapter(this, mp3list,  
  18.                 R.layout.music_list_item_layout, new String[] { "title""Artist""duration" },  
  19.                 new int[] { R.id.music_title, R.id.music_Artist, R.id.music_duration });  
  20.         mMusiclist.setAdapter(mAdapter);      
  21.     }  
/** 
	 * 填充列表 
	 * @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

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


2.   定义一个实现OnItemClickListener接口的内部类
  1. private class MusicListItemClickListener implements OnItemClickListener {  
  2.     @Override  
  3.     public void onItemClick(AdapterView<?> parent, View view, int position,  
  4.             long id) {  
  5.         if(mp3Infos != null) {  
  6.             Mp3Info mp3Info = mp3Infos.get(position);  
  7.             Log.d("mp3Info-->", mp3Info.toString());  
  8.             Intent intent = new Intent();  
  9.             intent.putExtra("url", mp3Info.getUrl());         
  10.             intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);  
  11.             intent.setClass(MainActivity.this, PlayerService.class);  
  12.             startService(intent);       //启动服务  
  13.         }  
  14.     }  
  15. }  
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类)

  1. package com.wwj.sb.service;  
  2.   
  3.   
  4. import android.annotation.SuppressLint;  
  5. import android.app.Service;  
  6. import android.content.Intent;  
  7. import android.media.MediaPlayer;  
  8. import android.media.MediaPlayer.OnPreparedListener;  
  9. import android.os.IBinder;  
  10.   
  11. import com.wwj.sb.domain.AppConstant;  
  12.   
  13. @SuppressLint("NewApi")  
  14. public class PlayerService extends Service {  
  15.     private MediaPlayer mediaPlayer =  new MediaPlayer();       //媒体播放器对象  
  16.     private String path;                        //音乐文件路径  
  17.     private boolean isPause;                    //暂停状态  
  18.       
  19.     @Override  
  20.     public IBinder onBind(Intent arg0) {  
  21.         return null;  
  22.     }  
  23.       
  24.     @Override  
  25.     public int onStartCommand(Intent intent, int flags, int startId) {  
  26.         if(mediaPlayer.isPlaying()) {  
  27.             stop();  
  28.         }  
  29.         path = intent.getStringExtra("url");          
  30.         int msg = intent.getIntExtra("MSG"0);  
  31.         if(msg == AppConstant.PlayerMsg.PLAY_MSG) {  
  32.             play(0);  
  33.         } else if(msg == AppConstant.PlayerMsg.PAUSE_MSG) {  
  34.             pause();  
  35.         } else if(msg == AppConstant.PlayerMsg.STOP_MSG) {  
  36.             stop();  
  37.         }  
  38.         return super.onStartCommand(intent, flags, startId);  
  39.     }  
  40.       
  41.   
  42.     /** 
  43.      * 播放音乐 
  44.      * @param position 
  45.      */  
  46.     private void play(int position) {  
  47.         try {  
  48.             mediaPlayer.reset();//把各项参数恢复到初始状态  
  49.             mediaPlayer.setDataSource(path);  
  50.             mediaPlayer.prepare();  //进行缓冲  
  51.             mediaPlayer.setOnPreparedListener(new PreparedListener(position));//注册一个监听器  
  52.         }  
  53.         catch (Exception e) {  
  54.             e.printStackTrace();  
  55.         }  
  56.     }  
  57.       
  58.     /** 
  59.      * 暂停音乐 
  60.      */  
  61.     private void pause() {  
  62.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  63.             mediaPlayer.pause();  
  64.             isPause = true;  
  65.         }  
  66.     }  
  67.       
  68.     /** 
  69.      * 停止音乐 
  70.      */  
  71.     private void stop(){  
  72.         if(mediaPlayer != null) {  
  73.             mediaPlayer.stop();  
  74.             try {  
  75.                 mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数  
  76.             } catch (Exception e) {  
  77.                 e.printStackTrace();  
  78.             }  
  79.         }  
  80.     }  
  81.       
  82.       
  83.     @Override  
  84.     public void onDestroy() {  
  85.         if(mediaPlayer != null){  
  86.             mediaPlayer.stop();  
  87.             mediaPlayer.release();  
  88.         }  
  89.     }  
  90.     /** 
  91.      *  
  92.      * 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放 
  93.      * 
  94.      */  
  95.     private final class PreparedListener implements OnPreparedListener {  
  96.         private int positon;  
  97.           
  98.         public PreparedListener(int positon) {  
  99.             this.positon = positon;  
  100.         }  
  101.           
  102.         @Override  
  103.         public void onPrepared(MediaPlayer mp) {  
  104.             mediaPlayer.start();    //开始播放  
  105.             if(positon > 0) {    //如果音乐不是从头播放  
  106.                 mediaPlayer.seekTo(positon);  
  107.             }  
  108.         }  
  109.     }  
  110.       
  111. }  
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。下次会实现控制音乐播放的需求

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
KIKK导航

KIKK导航

排行榜
关注我们

一个IT知识分享的公众号