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

来源:互联网 发布:ui设计的软件 编辑:程序博客网 时间:2024/05/05 08:03

------- android培训、java培训、期待与您交流! ----------


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

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

[java] view plaincopyprint?
  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. }  

[java] view plaincopyprint?
  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.     }  

实现效果如图:

   



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

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

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

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



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

[java] view plaincopyprint?
  1. mMusiclist = (ListView) findViewById(R.id.music_list);  
  2.         mMusiclist.setOnItemClickListener(new MusicListItemClickListener());  
  3.         mp3Infos = getMp3Infos();  
  4.         setListAdpter(getMp3Infos());  


2.   定义一个实现OnItemClickListener接口的内部类
[java] view plaincopyprint?
  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. }  


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

[java] view plaincopyprint?
  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. }  


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



原创粉丝点击