[Android]结合MediaPlayer和Service的音乐播放器

通过参照网上其他人的MP3播放器,自己也在这些基础上小试牛刀,制作的了一个MP3的播放器,先上个界面先:



接下来就上代码:

首先是.mp3格式的音乐文件的过滤类单独在一个java文件中:

  1. package com.example.mediaplayer;  
  2.   
  3. import java.io.File;  
  4. import java.io.FilenameFilter;  
  5.   
  6. public class MusicFilter implements FilenameFilter{  
  7.   
  8.     @Override  
  9.     public boolean accept(File dir, String filename) {  
  10.         // TODO Auto-generated method stub  
  11.         return (filename.endsWith(".mp3"));  
  12.     }  
  13.   
  14. }  

下面是MainActivity.java中的代码(其中音量和播放进度的方法是参照网上别人的):


  1. package com.example.mediaplayer;  
  2.   
  3. import java.io.File;  
  4. import java.util.ArrayList;  
  5. import java.util.HashMap;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.   
  9. import android.media.AudioManager;  
  10. import android.os.Bundle;  
  11. import android.annotation.SuppressLint;  
  12. import android.app.ListActivity;  
  13. import android.content.Intent;  
  14. import android.view.KeyEvent;  
  15. import android.view.Menu;  
  16. import android.view.MenuItem;  
  17. import android.view.View;  
  18. import android.view.View.OnClickListener;  
  19. import android.widget.ImageButton;  
  20. import android.widget.ListView;  
  21. import android.widget.SeekBar;  
  22. import android.widget.SimpleAdapter;  
  23. import android.widget.Toast;  
  24.   
  25. public class MainActivity extends ListActivity {  
  26.     public static ImageButton start_btn;  
  27.     private ImageButton last_btn;     
  28.     private ImageButton next_btn;  
  29.     public static SeekBar progressBar;  
  30.     private SeekBar volumeBar;  
  31.       
  32.     public static List<Map<String, Object>> mList= new ArrayList<Map<String,Object>>();  
  33.     public static int currentListItem=0;//当前播放歌曲的索引  
  34.     @SuppressLint("SdCardPath")  
  35.     public static String MUSIC_PATH = new String("/mnt/sdcard/Music/");   
  36.     public static AudioManager audioManager=null;          
  37.     private String[] mFrom=new String[]{"img","music_name"};  
  38.     private int[] mTo=new int[]{R.id.img, R.id.music_name};     
  39.      
  40.     protected void onCreate(Bundle savedInstanceState) {  
  41.         // TODO Auto-generated method stub  
  42.         super.onCreate(savedInstanceState);  
  43.         setContentView(R.layout.activity_main);  
  44.         musicList();  
  45.         init();                   
  46.     }  
  47.     /*初始化Button*/  
  48.     private void init(){  
  49.         next_btn= (ImageButton) this.findViewById(R.id.next_btn);  
  50.         next_btn.setOnClickListener(btnListen);  
  51.         start_btn = (ImageButton) this.findViewById(R.id.start_btn);  
  52.         start_btn.setOnClickListener(btnListen);  
  53.         last_btn= (ImageButton) this.findViewById(R.id.last_btn);     
  54.         last_btn.setOnClickListener(btnListen);  
  55.         volumeBar=(SeekBar) this.findViewById(R.id.volume_seekBar);           
  56.         progressBar =(SeekBar) this.findViewById(R.id.progressBar);  
  57.           
  58.         /*进度条监听*/  
  59.         progressBar.setOnSeekBarChangeListener(new ProgressBarChange());  
  60.         /*退出后再次进去程序时,进度条保持持续更新*/    
  61.         if(PlayerService.mediaPlayer!=null){    
  62.             //设置进度条最大值    
  63.             MainActivity.progressBar.setMax(PlayerService.mediaPlayer.getDuration());    
  64.             progressBar.setProgress(PlayerService.mediaPlayer.getCurrentPosition());    
  65.         }    
  66.           
  67.           
  68.               
  69.         audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);    
  70.         /* 把当前音量值赋给进度条 */         
  71.         volumeBar.setProgress(audioManager  .getStreamVolume(AudioManager.STREAM_MUSIC));    
  72.         /* 监听音量 */    
  73.         volumeBar.setOnSeekBarChangeListener(new VolumeBarChang());   
  74.     }  
  75.     /*设置按键监听*/  
  76.     private OnClickListener btnListen = new OnClickListener() {       
  77.         @Override  
  78.         public void onClick(View v) {  
  79.             switch (v.getId()) {  
  80.             case R.id.start_btn:  
  81.                 {  
  82.                     if(PlayerService.mediaPlayer.isPlaying()){  
  83.                         playMusic(AppConstant.PlayerMag.PAUSE);  
  84.                         start_btn.setImageDrawable(getResources().getDrawable(R.drawable.pause_round));  
  85.                     }else{  
  86.                         playMusic(AppConstant.PlayerMag.PLAY);  
  87.                         start_btn.setImageDrawable(getResources().getDrawable(R.drawable.play_round));  
  88.                     }                     
  89.                 }     
  90.                 break;  
  91.             case R.id.next_btn:  
  92.                 nextMusic();                              
  93.                 break;        
  94.             case R.id.last_btn:  
  95.                 frontMusic();  
  96.                 break;  
  97.             default:  
  98.                 break;  
  99.             }             
  100.         }  
  101.     };  
  102.     /*显示歌曲到listView*/  
  103.     public void musicList(){  
  104.         File home= new File(MUSIC_PATH);  
  105.         File[] files=home.listFiles(new MusicFilter());  
  106.         Map<String,Object> mMap = null;    
  107.         mList.clear();  
  108.         if(files.length > 0){  
  109.             for(File f:files){  
  110.                 mMap = new HashMap<String,Object>();    
  111.                 mMap.put("img", R.drawable.music_round);                  
  112.                 mMap.put("music_name", f.getName());   
  113.                 mList.add(mMap);  
  114.             }  
  115.         }  
  116.         SimpleAdapter mAdapter = new SimpleAdapter(this, mList, R.layout.item, mFrom, mTo);       
  117.         setListAdapter(mAdapter);     
  118.     }  
  119.   
  120.     //播放音乐   
  121.    public void playMusic(int action){  
  122.        Intent intent = new Intent();    
  123.        intent.putExtra("CMD", action);    
  124.        intent.putExtra("ITEM", currentListItem);  
  125.        intent.setClass(MainActivity.this, PlayerService.class);        
  126.        startService(intent);    
  127.    }  
  128.      
  129.    //下一首  
  130.    public void nextMusic(){  
  131.        if (++currentListItem >= mList.size()) {    
  132.            Toast.makeText(MainActivity.this"已到最后一首歌曲", Toast.LENGTH_SHORT)  .show();    
  133.            currentListItem = mList.size() - 1;    
  134.        } else {           
  135.             playMusic(AppConstant.PlayerMag.PLAY);     
  136.        }    
  137.          
  138.    }  
  139.      
  140.    //上一首  
  141.     public void frontMusic(){  
  142.        if (--currentListItem > 0) {        
  143.             playMusic(AppConstant.PlayerMag.PLAY);    
  144.    
  145.        } else {    
  146.            Toast.makeText(MainActivity.this"已到第一首歌曲", Toast.LENGTH_SHORT)    
  147.                    .show();    
  148.            currentListItem = 0;    
  149.        }         
  150.    }   
  151.    
  152.     /* 音乐选择监听  
  153.     * 用户点击listview的栏目,直接播放 
  154.     * */  
  155.    @Override  
  156.     protected void onListItemClick(ListView l, View v, int position, long id) {  
  157.         currentListItem = position;   
  158.         playMusic(AppConstant.PlayerMag.PLAY);  
  159.           
  160.     }  
  161.     @Override  
  162.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  163.         // TODO Auto-generated method stub  
  164.         if(keyCode == KeyEvent.KEYCODE_BACK){  
  165.             this.finish();  
  166.         }         
  167.         return super.onKeyDown(keyCode, event);  
  168.     }  
  169.     @Override  
  170.     public boolean onCreateOptionsMenu(Menu menu) {  
  171.         // TODO Auto-generated method stub  
  172.         getMenuInflater().inflate(R.menu.main, menu);  
  173.         return true;  
  174.     }  
  175.     @Override  
  176.     public boolean onOptionsItemSelected(MenuItem item) {  
  177.         // TODO Auto-generated method stub        
  178.         if(item.getItemId() == R.id.exit){  
  179.             Intent intent = new Intent();  
  180.             intent.setClass(MainActivity.this, PlayerService.class);  
  181.             stopService(intent);//停止Service  
  182.             MainActivity.this.finish();  
  183.         }  
  184.         return super.onOptionsItemSelected(item);  
  185.     }  
  186. }  

其中进度和音量的实现如下:

  1. package com.example.mediaplayer;  
  2.   
  3. import android.widget.SeekBar;  
  4.   
  5.   
  6. /* 
  7.  * 播放进度监听 
  8.  * */  
  9. public class ProgressBarChange implements SeekBar.OnSeekBarChangeListener{  
  10.   
  11.     @Override  
  12.     public void onProgressChanged(SeekBar seekBar, int progress,  
  13.             boolean fromUser) {  
  14.         // TODO Auto-generated method stub  
  15.         // 当进度条的值改变时,音乐播放器从新的位置开始播放    
  16.         if(fromUser){  
  17.             PlayerService.mediaPlayer.seekTo(progress);  
  18.         }  
  19.           
  20.     }  
  21.   
  22.     @Override  
  23.     public void onStartTrackingTouch(SeekBar seekBar) {  
  24.         // TODO Auto-generated method stub  
  25.         PlayerService.mediaPlayer.pause(); // 开始拖动进度条时,音乐暂停播放   
  26.           
  27.     }  
  28.   
  29.     @Override  
  30.     public void onStopTrackingTouch(SeekBar seekBar) {  
  31.         // TODO Auto-generated method stub  
  32.         PlayerService.mediaPlayer.start();// 停止拖动进度条时,音乐开始播放   
  33.     }  
  34.   
  35. }  

  1. package com.example.mediaplayer;  
  2.   
  3. import android.media.AudioManager;  
  4. import android.widget.SeekBar;  
  5.   
  6.   
  7. /* 
  8.  * 音量监听 
  9.  * */  
  10. public class VolumeBarChang implements SeekBar.OnSeekBarChangeListener{  
  11.   
  12.     @Override  
  13.     public void onProgressChanged(SeekBar seekBar, int progress,  
  14.             boolean fromUser) {  
  15.         // TODO Auto-generated method stub  
  16.         MainActivity.audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress,    
  17.                  0);   
  18.           
  19.     }  
  20.   
  21.     @Override  
  22.     public void onStartTrackingTouch(SeekBar seekBar) {  
  23.         // TODO Auto-generated method stub  
  24.           
  25.     }  
  26.   
  27.     @Override  
  28.     public void onStopTrackingTouch(SeekBar seekBar) {  
  29.         // TODO Auto-generated method stub  
  30.           
  31.     }  
  32.   
  33. }  

最后就是service部分的了:

  1. package com.example.mediaplayer;  
  2. import java.io.IOException;  
  3. import java.util.Map;  
  4.   
  5. import android.app.Service;  
  6. import android.content.Intent;  
  7. import android.media.MediaPlayer;  
  8. import android.os.IBinder;  
  9. import android.widget.Toast;  
  10.   
  11.   
  12. public class PlayerService extends Service implements Runnable,  
  13.             MediaPlayer.OnCompletionListener{  
  14.   
  15.     public static MediaPlayer mediaPlayer=null;  
  16.     private static boolean isLoop=false;  
  17.     private String path = null;  
  18.     private int CMD;  
  19.       
  20.   
  21.     @Override  
  22.     public void onCreate() {  
  23.         // TODO Auto-generated method stub  
  24.         super.onCreate();  
  25.         if(mediaPlayer != null){  
  26.             mediaPlayer.reset();  
  27.             mediaPlayer.release();  
  28.             mediaPlayer=null;  
  29.         }  
  30.         mediaPlayer=new MediaPlayer();    
  31.         mediaPlayer.setOnCompletionListener(this);  
  32.     }  
  33.       
  34.     @Override  
  35.     public int onStartCommand(Intent intent, int flags, int startId) {  
  36.         // TODO Auto-generated method stub        
  37.         CMD=(int)intent.getIntExtra("CMD", AppConstant.PlayerMag.PLAY);  
  38.           
  39.         if(CMD == AppConstant.PlayerMag.PLAY){            
  40.             playMusic((int)intent.getIntExtra("ITEM",MainActivity.currentListItem));              
  41.         }else if(CMD == AppConstant.PlayerMag.PAUSE){  
  42.             if(mediaPlayer.isPlaying()){  
  43.                 mediaPlayer.pause();  
  44.             }else {  
  45.                 mediaPlayer.start();  
  46.             }  
  47.               
  48.         }  
  49.         new Thread(this).start();//进度条开始  
  50.         return super.onStartCommand(intent, flags, startId);  
  51.     }  
  52.       
  53.     public void playMusic(int item) {    
  54.         try {   
  55.             Map<String, Object> map = MainActivity.mList.get(item);  
  56.             path=MainActivity.MUSIC_PATH+map.get("music_name");  
  57.               
  58.             mediaPlayer.reset();               
  59.             mediaPlayer.setDataSource(path);           
  60.             mediaPlayer.prepare();                    
  61.             mediaPlayer.start();              
  62.             mediaPlayer.setLooping(isLoop);           
  63.               
  64.             MainActivity.progressBar.setMax(PlayerService.mediaPlayer.getDuration());//设置播放进度条的最大值    
  65.         } catch (IllegalArgumentException e) {  
  66.             // TODO Auto-generated catch block  
  67.             e.printStackTrace();  
  68.         } catch (SecurityException e) {  
  69.             // TODO Auto-generated catch block  
  70.             e.printStackTrace();  
  71.         } catch (IllegalStateException e) {  
  72.             // TODO Auto-generated catch block  
  73.             e.printStackTrace();  
  74.         } catch (IOException e) {  
  75.             // TODO Auto-generated catch block  
  76.             e.printStackTrace();  
  77.         }              
  78.     }  
  79.     @Override  
  80.     public IBinder onBind(Intent intent) {  
  81.         // TODO Auto-generated method stub  
  82.         return null;  
  83.     }  
  84.       
  85.     @Override  
  86.     public void onDestroy() {  
  87.         // TODO Auto-generated method stub  
  88.         super.onDestroy();  
  89.         if(mediaPlayer != null){  
  90.             mediaPlayer.stop();  
  91.             mediaPlayer.release();  
  92.             mediaPlayer=null;  
  93.         }  
  94.     }  
  95.   
  96.     @Override  
  97.     public void run() {  
  98.         int currentPosition = 0;// 设置默认进度条当前位置    
  99.         int total = mediaPlayer.getDuration();//    
  100.         while (mediaPlayer != null && currentPosition < total) {    
  101.             try {    
  102.                 Thread.sleep(1000);    
  103.                 if (mediaPlayer != null) {    
  104.                     currentPosition = mediaPlayer.getCurrentPosition();    
  105.                 }    
  106.             } catch (InterruptedException e) {    
  107.                 e.printStackTrace();    
  108.             }  
  109.             MainActivity.progressBar.setProgress(currentPosition);  
  110.         }    
  111.           
  112.     }  
  113.     @Override  
  114.     public void onCompletion(MediaPlayer mp) {  
  115.         /*当前歌曲播放完,自动播放跳到下一首*/  
  116.         if (++MainActivity.currentListItem >= MainActivity.mList.size()) {  
  117.             Toast.makeText(PlayerService.this"已到最后一首歌曲", Toast.LENGTH_SHORT)  
  118.                     .show();  
  119.             MainActivity.currentListItem--;  
  120.             MainActivity.progressBar.setMax(0);  
  121.         } else {  
  122.                       
  123.             playMusic(MainActivity.currentListItem);  
  124.               
  125.         }  
  126.         MainActivity.start_btn.setImageDrawable(getResources().getDrawable(R.drawable.play_round));  
  127.     }     
  128. }  

业余时间第一次去做算是比较完整小应用,其中学到真的还是很多的,其中很多是在blog的各大神中学的,

所以自己也要把这次发布出来,希望各位大神级的多多指点下我这种菜鸟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值