android開發之MediaPlayer+Service MP3播放器

  1. import java.io.File;  
  2. import java.io.FilenameFilter;  
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.ListActivity;  
  7. import android.apps.service.PlayerService;  
  8. import android.content.Intent;  
  9. import android.media.AudioManager;  
  10. import android.os.Bundle;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.ArrayAdapter;  
  14. import android.widget.Button;  
  15. import android.widget.SeekBar;  
  16. import android.widget.Toast;  
  17.   
  18. public class TestMediaPlayer extends ListActivity {  
  19.     /* 前段時間剛學習Android時就以爲MediaPlayer是個很神奇的東西,就試着作了個簡單的音樂播放器。 
  20.      * 支持後臺播放、進度條拖放、音量控制、讀取sdCard音樂文件進行播放等。 
  21.      * */  
  22.     private Button playButton = null;  
  23.     private Button mFrontButton = null;  
  24.     private Button mLastButton = null;  
  25.     private Button exit = null;  
  26.     /* 聲明音量管理器 */  
  27.     private AudioManager mAudioManager = null;  
  28.   
  29.     /* 定義進度條 */  
  30.     public static SeekBar audioSeekBar = null;  
  31.   
  32.     /* 定義音量大小 */  
  33.     private SeekBar audioVolume = null;  
  34.   
  35.     /* 定於一個數據播放列表,用來存放從指定文件中搜索到的文件 */  
  36.     public static List<String> mMusicList = new ArrayList<String>();  
  37.   
  38.     /* 定義音樂存放路徑 */  
  39. //  private static final String MUSIC_PATH = new String("/mnt/sdcard/"); //android 2.2  
  40.     private static final String MUSIC_PATH = new String("/sdcard/");//android 2.1  
  41.     /* 定義在播放列表中的當前選擇項 */  
  42.     public static int currentListItme = 0;  
  43.   
  44.     @Override  
  45.     public void onCreate(Bundle savedInstanceState) {  
  46.         super.onCreate(savedInstanceState);  
  47.         setContentView(R.layout.main);  
  48.         /* 更新列表 */  
  49.         musicList();  
  50.         /* 獲得控件 */  
  51.         playButton = (Button) findViewById(R.id.StartMusic);  
  52.         mFrontButton = (Button) findViewById(R.id.FrontButton);  
  53.         mLastButton = (Button) findViewById(R.id.LastMusic);  
  54.         audioVolume = (SeekBar) findViewById(R.id.audioVolume);  
  55.         exit = (Button)findViewById(R.id.exit);  
  56.         audioSeekBar = (SeekBar) findViewById(R.id.seekbar01);  
  57.         /* 播放、暫停監聽 */  
  58.         playButton.setOnClickListener(new OnClickListener() {  
  59.   
  60.             @Override  
  61.             public void onClick(View v) {  
  62.   
  63.                 playMusic(AppConstant.PlayerMag.PAUSE);  
  64.             }  
  65.         });  
  66.         /* 監聽下一首 */  
  67.         mFrontButton.setOnClickListener(new OnClickListener() {  
  68.   
  69.             @Override  
  70.             public void onClick(View v) {  
  71.                 nextMusic();  
  72.             }  
  73.         });  
  74.         /* 監聽上一首 */  
  75.         mLastButton.setOnClickListener(new View.OnClickListener() {  
  76.   
  77.             @Override  
  78.             public void onClick(View v) {  
  79.                 FrontMusic();  
  80.             }  
  81.         });  
  82.         /*退出監聽*/  
  83.         exit.setOnClickListener(new OnClickListener() {  
  84.               
  85.             @Override  
  86.             public void onClick(View v) {  
  87.                 Intent intent = new Intent();  
  88.                 intent.setClass(TestMediaPlayer.this, PlayerService.class);  
  89.                 stopService(intent);//中止Service  
  90.                 try {  
  91.                     TestMediaPlayer.this.finish();//關閉當前Activity  
  92.                 } catch (Throwable e) {  
  93.                     e.printStackTrace();  
  94.                 }  
  95.               
  96.                   
  97.             }  
  98.         });  
  99.         /* 播放進度監聽 */  
  100.         audioSeekBar.setOnSeekBarChangeListener(new SeekBarChangeEvent());  
  101.         /*退出後再次進去程序時,進度條保持持續更新*/  
  102.         if(PlayerService.mMediaPlayer!=null){  
  103.             //設置進度條最大值  
  104.             TestMediaPlayer.audioSeekBar.setMax(PlayerService.mMediaPlayer.getDuration());  
  105.             audioSeekBar.setProgress(PlayerService.mMediaPlayer.getCurrentPosition());  
  106.         }  
  107.           
  108.           
  109.         /* 獲得當前音量對象 */  
  110.         mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);  
  111.         /* 把當前音量值賦給進度條 */  
  112.         audioVolume.setProgress(mAudioManager  
  113.                 .getStreamVolume(AudioManager.STREAM_MUSIC));  
  114.         /* 監聽音量 */  
  115.         audioVolume.setOnSeekBarChangeListener(new AudioVolumeChangeEvent());  
  116.     }  
  117.   
  118.     public void playMusic(int action) {  
  119.         Intent intent = new Intent();  
  120.         intent.putExtra("MSG", action);  
  121.         intent.setClass(TestMediaPlayer.this, PlayerService.class);  
  122.           
  123.         /* 啓動service service要在AndroidManifest.xml註冊如:<service></service>*/  
  124.           
  125.         startService(intent);  
  126.     }  
  127.   
  128.     /* 檢測sdcard MP3文件並加入到List列表 */  
  129.     public void musicList() {  
  130.         // 先清除list中的緩存  
  131.         mMusicList.clear();  
  132.         /* 從指定的路徑中讀取文件,並與播放列表關聯 */  
  133.         File home = new File(MUSIC_PATH);  
  134.           
  135.         System.out.println(home.canRead());  
  136.         /* 讀取指定類型的文件,在本程序,指定播放類型爲mp3 */  
  137.         if (home.listFiles(new MusicFilter()).length > 0) {  
  138.             /* 讀取文件 */  
  139.             for (File file : home.listFiles(new MusicFilter())) {  
  140.                 mMusicList.add(file.getName());  
  141.             }  
  142.             /* 播放文件與播放列表關聯 */  
  143.             ArrayAdapter<String> musicList = new ArrayAdapter<String>(  
  144.                     TestMediaPlayer.this, R.layout.musictime, mMusicList);  
  145.             setListAdapter(musicList);  
  146.         }  
  147.     }  
  148.   
  149.     /* 音量監聽 */  
  150.     class AudioVolumeChangeEvent implements SeekBar.OnSeekBarChangeListener {  
  151.   
  152.         @Override  
  153.         public void onProgressChanged(SeekBar seekBar, int progress,  
  154.                 boolean fromUser) {  
  155.   
  156.             // mAudioManager.adjustVolume(AudioManager.ADJUST_LOWER, 0);  
  157.             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress,  
  158.                     0);  
  159.   
  160.         }  
  161.   
  162.         @Override  
  163.         public void onStartTrackingTouch(SeekBar seekBar) {  
  164.         }  
  165.   
  166.         @Override  
  167.         public void onStopTrackingTouch(SeekBar seekBar) {  
  168.         }  
  169.   
  170.     }  
  171.   
  172.     /* 音樂選擇監聽 */  
  173.     @Override  
  174.     protected void onListItemClick(android.widget.ListView l, View v,  
  175.             int position, long id) {  
  176.         super.onListItemClick(l, v, position, id);  
  177.         currentListItme = position;  
  178.         playMusic(AppConstant.PlayerMag.PLAY_MAG);  
  179.     }  
  180.   
  181.     /* 播放下一首 */  
  182.     private void nextMusic() {  
  183.         if (++currentListItme >= mMusicList.size()) {  
  184.             Toast.makeText(TestMediaPlayer.this, "已到最後一首歌曲", Toast.LENGTH_SHORT)  
  185.                     .show();  
  186.             currentListItme = mMusicList.size() - 1;  
  187.         } else {  
  188.             playMusic(AppConstant.PlayerMag.PLAY_MAG);  
  189.         }  
  190.     }  
  191.   
  192.     /* 播放上一首歌曲 */  
  193.     private void FrontMusic() {  
  194.         if (--currentListItme >= 0) {  
  195.             playMusic(AppConstant.PlayerMag.PLAY_MAG);  
  196.   
  197.         } else {  
  198.             Toast.makeText(TestMediaPlayer.this, "已到第一首歌曲", Toast.LENGTH_SHORT)  
  199.                     .show();  
  200.             currentListItme = 0;  
  201.         }  
  202.     }  
  203. }  
  204.   
  205. /* 播放文件選擇類 */  
  206. class MusicFilter implements FilenameFilter {  
  207.     public boolean accept(File dir, String name) {  
  208.         /* 指定擴展名類型 ,能夠加其餘的音樂格式*/  
  209.         return (name.endsWith(".mp3"));  
  210.     }  
  211. }  
  212.   
  213. /* 拖放進度監聽 ,別忘了Service裏面還有個進度條刷新*/  
  214. class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {  
  215.   
  216.     @Override  
  217.     public void onProgressChanged(SeekBar seekBar, int progress,  
  218.             boolean fromUser) {  
  219.         /*假設改變源於用戶拖動*/  
  220.         if (fromUser) {  
  221.             PlayerService.mMediaPlayer.seekTo(progress);// 當進度條的值改變時,音樂播放器重新的位置開始播放  
  222.         }  
  223.     }  
  224.   
  225.     @Override  
  226.     public void onStartTrackingTouch(SeekBar seekBar) {  
  227.         PlayerService.mMediaPlayer.pause(); // 開始拖動進度條時,音樂暫停播放  
  228.     }  
  229.   
  230.     @Override  
  231.     public void onStopTrackingTouch(SeekBar seekBar) {  
  232.         PlayerService.mMediaPlayer.start(); // 中止拖動進度條時,音樂開始播放  
  233.     }  
  234. }  


service類java

首先建議不要把播放音樂放在Activity中,由於關閉Activity後就不能實現後臺播放。因此播放音樂要放在Service中,咱們只須要管理Activity與Service間的通訊就行了。下面就是個Service類。直接看註釋和代碼:android

[java]  view plain copy
 
  1. package android.apps.service;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import android.app.Service;  
  6. import android.content.Intent;  
  7. import android.media.MediaPlayer;  
  8. import android.net.Uri;  
  9. import android.os.IBinder;  
  10. import android.widget.Toast;  
  11.   
  12. import android.apps.*;  
  13.   
  14. public class PlayerService extends Service implements Runnable,  
  15.         MediaPlayer.OnCompletionListener {  
  16.     /* 定於一個多媒體對象 */  
  17.     public static MediaPlayer mMediaPlayer = null;  
  18.     // 是否單曲循環  
  19.     private static boolean isLoop = false;  
  20.     // 用戶操做  
  21.     private int MSG;  
  22.   
  23.     /* 定義要播放的文件夾路徑 */  
  24.     private static final String MUSIC_PATH = new String("/sdcard/");  
  25.   
  26.     @Override  
  27.     public IBinder onBind(Intent intent) {  
  28.         return null;// 這裏的綁定沒的用,上篇我貼出瞭如何將activity與service綁定的代碼  
  29.     }  
  30.   
  31.     @Override  
  32.     public void onCreate() {  
  33.         super.onCreate();  
  34.         if (mMediaPlayer != null) {  
  35.             mMediaPlayer.reset();  
  36.             mMediaPlayer.release();  
  37.             mMediaPlayer = null;  
  38.         }  
  39.         mMediaPlayer = new MediaPlayer();  
  40.         /* 監聽播放是否完成 */  
  41.         mMediaPlayer.setOnCompletionListener(this);  
  42.     }  
  43.   
  44.     @Override  
  45.     public void onDestroy() {  
  46.         super.onDestroy();  
  47.   
  48.         if (mMediaPlayer != null) {  
  49.             mMediaPlayer.stop();  
  50.             mMediaPlayer.release();  
  51.             mMediaPlayer = null;  
  52.         }  
  53.   
  54.         System.out.println("service onDestroy");  
  55.     }  
  56.     /*啓動service時執行的方法*/  
  57.     @Override  
  58.     public int onStartCommand(Intent intent, int flags, int startId) {  
  59.         /*獲得從startService傳來的動做,後是默認參數,這裏是我自定義的常量*/  
  60.         MSG = intent.getIntExtra("MSG", AppConstant.PlayerMag.PLAY_MAG);  
  61.         if (MSG == AppConstant.PlayerMag.PLAY_MAG) {  
  62.             playMusic();  
  63.         }  
  64.         if (MSG == AppConstant.PlayerMag.PAUSE) {  
  65.             if (mMediaPlayer.isPlaying()) {// 正在播放  
  66.                 mMediaPlayer.pause();// 暫停  
  67.             } else {// 沒有播放  
  68.                 mMediaPlayer.start();  
  69.             }  
  70.         }  
  71.   
  72.         return super.onStartCommand(intent, flags, startId);  
  73.     }  
  74.   
  75.     @SuppressWarnings("static-access")  
  76.     public void playMusic() {  
  77.         try {  
  78.             /* 重置多媒體 */  
  79.             mMediaPlayer.reset();  
  80.             /* 讀取mp3文件 */  
  81.             mMediaPlayer.setDataSource(MUSIC_PATH+TestMediaPlayer.mMusicList.get(TestMediaPlayer.currentListItme));  
  82. //          Uri uri = Uri.parse(MUSIC_PATH+TestMediaPlayer.mMusicList.get(TestMediaPlayer.currentListItme));  
  83. //            
  84. //          mMediaPlayer.create(PlayerService.this,uri);  
  85.             /* 準備播放 */  
  86.             mMediaPlayer.prepare();  
  87.             /* 開始播放 */  
  88.             mMediaPlayer.start();  
  89.             /* 是否單曲循環 */  
  90.             mMediaPlayer.setLooping(isLoop);  
  91.             // 設置進度條最大值  
  92.             TestMediaPlayer.audioSeekBar.setMax(PlayerService.mMediaPlayer  
  93.                     .getDuration());  
  94.             new Thread(this).start();  
  95.         } catch (IOException e) {  
  96.         }  
  97.   
  98.     }  
  99.   
  100.     // 刷新進度條  
  101.     @Override  
  102.     public void run() {  
  103.         int CurrentPosition = 0;// 設置默認進度條當前位置  
  104.         int total = mMediaPlayer.getDuration();//  
  105.         while (mMediaPlayer != null && CurrentPosition < total) {  
  106.             try {  
  107.                 Thread.sleep(1000);  
  108.                 if (mMediaPlayer != null) {  
  109.                     CurrentPosition = mMediaPlayer.getCurrentPosition();  
  110.                 }  
  111.             } catch (InterruptedException e) {  
  112.                 e.printStackTrace();  
  113.             }  
  114.             TestMediaPlayer.audioSeekBar.setProgress(CurrentPosition);  
  115.         }  
  116.   
  117.     }  
  118.   
  119.     @Override  
  120.     public void onCompletion(MediaPlayer mp) {  
  121.         /* 播放完當前歌曲,自動播放下一首 */  
  122.   
  123.         if (++TestMediaPlayer.currentListItme >= TestMediaPlayer.mMusicList  
  124.                 .size()) {  
  125.             Toast.makeText(PlayerService.this, "已到最後一首歌曲", Toast.LENGTH_SHORT)  
  126.                     .show();  
  127.             TestMediaPlayer.currentListItme--;  
  128.             TestMediaPlayer.audioSeekBar.setMax(0);  
  129.         } else {  
  130.             playMusic();  
  131.         }  
  132.     }  
  133. }  

參數封裝緩存

[java]  view plain copy
 
  1. /** 
  2.  * @把參數這樣封裝易於管理和閱讀 
  3.  * 
  4.  */  
  5. public interface AppConstant {  
  6.     public class PlayerMag{  
  7.         public static final int PLAY_MAG=1;//開始播放  
  8.         public static final int PAUSE=2;//暫停播放  
  9.     }  
  10. }  


詳細代碼下載:http://download.csdn.net/source/3318587app

相關文章
相關標籤/搜索