Android 小項目之--Mini音樂播放器【簡單版】(附源碼)

繼上篇音樂播放器,咱們講到使用 SDCard 播放音樂的例子,上篇也將如何在 Android 模擬器中建立 SDCard 的步驟列了出來。本篇將擴展上篇例子,去獲取SDCard 的所存內存,顯示出來告訴用戶。本篇講述的內容以下:
  • 一、講述 Environment 類。
  • 二、講述 StatFs 類。
  • 三、完整例子讀取 SDCard 內存

一、講述 Environment 類Environment 是一個提供訪問環境變量的類。Environment包含常量:
  • MEDIA_BAD_REMOVAL
    解釋:返回getExternalStorageState() ,代表SDCard 被卸載前己被移除
  • MEDIA_CHECKING
    解釋:返回getExternalStorageState() ,代表對象正在磁盤檢查。
  • MEDIA_MOUNTED
    解釋:返回getExternalStorageState() ,代表對象是否存在並具備讀/寫權限
  • MEDIA_MOUNTED_READ_ONLY
    解釋:返回getExternalStorageState() ,代表對象權限爲只讀
  • MEDIA_NOFS
    解釋:返回getExternalStorageState() ,代表對象爲空白或正在使用不受支持的文件系統。
  • MEDIA_REMOVED
    解釋:返回getExternalStorageState() ,若是不存在 SDCard 返回
  • MEDIA_SHARED
    解釋:返回getExternalStorageState() ,若是 SDCard 未安裝 ,並經過 USB 大容量存儲共享 返回
  • MEDIA_UNMOUNTABLE
    解釋:返回getExternalStorageState() ,返回 SDCard 不可被安裝 若是 SDCard 是存在但不能夠被安裝
  • MEDIA_UNMOUNTED
    解釋:返回getExternalStorageState() ,返回 SDCard 已卸掉若是 SDCard  是存在可是沒有被安裝
Environment 經常使用方法:
  • 方法:getDataDirectory()
    解釋:返回 File ,獲取 Android 數據目錄。
  • 方法:getDownloadCacheDirectory()
    解釋:返回 File ,獲取 Android 下載/緩存內容目錄。
  • 方法:getExternalStorageDirectory()
    解釋:返回 File ,獲取外部存儲目錄即 SDCard
  • 方法:getExternalStoragePublicDirectory(String type)
    解釋:返回 File ,取一個高端的公用的外部存儲器目錄來擺放某些類型的文件
  • 方法:getExternalStorageState()
    解釋:返回 File ,獲取外部存儲設備的當前狀態
  • 方法:getRootDirectory()
    解釋:返回 File ,獲取 Android 的根目錄
二、講述 StatFs 類StatFs 一個模擬linux的df命令的一個類,得到SD卡和手機內存的使用狀況
StatFs 經常使用方法:
  • getAvailableBlocks()
    解釋:返回 Int ,獲取當前可用的存儲空間
  • getBlockCount()
    解釋:返回 Int ,獲取該區域可用的文件系統數
  • getBlockSize()
    解釋:返回 Int ,大小,以字節爲單位,一個文件系統
  • getFreeBlocks()
    解釋:返回 Int ,該塊區域剩餘的空間
  • restat(String path)
    解釋:執行一個由該對象所引用的文件系統
三、完整例子讀取 SDCard 內存存儲卡在 Android 手機上是能夠隨時插拔的,每次的動做都對引發操做系統進行 ACTION_BROADCAST,本例子將使用上面學到的方法,計算出 SDCard 的剩餘容量和總容量。代碼以下:
1.png
2.png

下面是圖例顯示 MediaPlayer 的生命週期
3.gif
3.一、MediaPlayer 經常使用方法介紹
  • 方法:create(Context context, Uri uri)  
    解釋:靜態方法,經過Uri建立一個多媒體播放器。
  • 方法:create(Context context, int resid)
    解釋:靜態方法,經過資源ID建立一個多媒體播放器
  • 方法:create(Context context, Uri uri, SurfaceHolder holder)
    解釋:靜態方法,經過Uri和指定 SurfaceHolder 【抽象類】 建立一個多媒體播放器
  • 方法: getCurrentPosition()
    解釋:返回 Int, 獲得當前播放位置
  • 方法: getDuration()
    解釋:返回 Int,獲得文件的時間
  • 方法:getVideoHeight()
    解釋:返回 Int ,獲得視頻的高度
  • 方法:getVideoWidth()
    解釋:返回 Int,獲得視頻的寬度
  • 方法:isLooping()
    解釋:返回 boolean ,是否循環播放
  • 方法:isPlaying()
    解釋:返回 boolean,是否正在播放
  • 方法:pause()
    解釋:無返回值 ,暫停
  • 方法:prepare()
    解釋:無返回值,準備同步
  • 方法:prepareAsync()
    解釋:無返回值,準備異步
  • 方法:release()
    解釋:無返回值,釋放 MediaPlayer  對象
  • 方法:reset()
    解釋:無返回值,重置 MediaPlayer  對象
  • 方法:seekTo(int msec)
    解釋:無返回值,指定播放的位置(以毫秒爲單位的時間)
  • 方法:setAudioStreamType(int streamtype)
    解釋:無返回值,指定流媒體的類型
  • 方法:setDataSource(String path)
    解釋:無返回值,設置多媒體數據來源【根據 路徑】
  • 方法:setDataSource(FileDescriptor fd, long offset, long length)
    解釋:無返回值,設置多媒體數據來源【根據 FileDescriptor】
  • 方法:setDataSource(FileDescriptor fd)
    解釋:無返回值,設置多媒體數據來源【根據 FileDescriptor】
  • 方法:setDataSource(Context context, Uri uri)
    解釋:無返回值,設置多媒體數據來源【根據 Uri】
  • 方法:setDisplay(SurfaceHolder sh)
    解釋:無返回值,設置用 SurfaceHolder 來顯示多媒體
  • 方法:setLooping(boolean looping)
    解釋:無返回值,設置是否循環播放
  • 事件:setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)
    解釋:監聽事件,網絡流媒體的緩衝監聽
  • 事件:setOnCompletionListener(MediaPlayer.OnCompletionListener listener)
    解釋:監聽事件,網絡流媒體播放結束監聽
  • 事件:setOnErrorListener(MediaPlayer.OnErrorListener listener)
    解釋:監聽事件,設置錯誤信息監聽
  • 事件:setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)
    解釋:監聽事件,視頻尺寸監聽
  • 方法:setScreenOnWhilePlaying(boolean screenOn)
    解釋:無返回值,設置是否使用 SurfaceHolder 顯示
  • 方法:setVolume(float leftVolume, float rightVolume)
    解釋:無返回值,設置音量
  • 方法:start()
    解釋:無返回值,開始播放
  • 方法:stop()
    解釋:無返回值,中止播放
四、完整音樂播放例子演示經過上面的講解大體知道了 MediaPlayer 的播放原理,下面咱們來完成一個小項目,即實現一個 Mini 版音樂播放器。這個播放器中咱們須要有暫停、中止、上一首、下一首等基本按鈕,有了上面的講解要實現這個小項目就輕鬆多了,下面將貼出代碼

  1. import java.io.File;
  2. import java.io.FilenameFilter;

  3. public class MusicFilter implements FilenameFilter{

  4.     @Override
  5.     public boolean accept(File dir, String filename) {
  6.         // TODO Auto-generated method stub
  7.         return (filename.endsWith(".mp3"));
  8.     }

  9.      
  10. }
複製代碼
Tip:播放器不可能只是但願播放一種音樂格式,而且還須要自動識別指定的路徑中哪些是能夠播放的音頻文件,哪些是不支持的格式,以上代碼能夠做爲參考。好了,下面貼出完整代碼

  1. package com.terry;

  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import android.app.ListActivity;
  6. import android.media.MediaPlayer;
  7. import android.media.MediaPlayer.OnCompletionListener;
  8. import android.os.Bundle;
  9. import android.view.KeyEvent;
  10. import android.view.View;
  11. import android.view.View.OnClickListener;
  12. import android.widget.ArrayAdapter;
  13. import android.widget.Button;
  14. import android.widget.ListView;
  15. import android.widget.Toast;

  16. public class musicActivity extends ListActivity {
  17.     //播放對象
  18.     private MediaPlayer myMediaPlayer;
  19.     //播放列表
  20.     private List<String> myMusicList=new ArrayList<String>();
  21.     //當前播放歌曲的索引
  22.     private int currentListItem=0;
  23.     //音樂的路徑
  24.     private static final String MUSIC_PATH=new String("/sdcard/");
  25.    
  26.     /** Called when the activity is first created. */
  27.     @Override
  28.     public void onCreate(Bundle savedInstanceState) {
  29.         super.onCreate(savedInstanceState);
  30.         setContentView(R.layout.main);
  31.         myMediaPlayer=new MediaPlayer();
  32.         
  33.         findView();
  34.         musicList();
  35.         listener();
  36.     }
  37.    
  38.    
  39.     //綁定音樂
  40.     void musicList(){
  41.         File home=new File(MUSIC_PATH);
  42.         if(home.listFiles(new MusicFilter()).length>0){
  43.             for(File file:home.listFiles(new MusicFilter())){
  44.                 myMusicList.add(file.getName());
  45.             }
  46.             ArrayAdapter<String> musicList=new ArrayAdapter<String>
  47.             (musicActivity.this,R.layout.musicitme, myMusicList);
  48.             setListAdapter(musicList);
  49.         }
  50.     }
  51.    
  52.     //獲取按鈕
  53.    void findView(){
  54.        viewHolder.start=(Button)findViewById(R.id.start);
  55.        viewHolder.stop=(Button)findViewById(R.id.stop);
  56.        viewHolder.next=(Button)findViewById(R.id.next);
  57.        viewHolder.pause=(Button)findViewById(R.id.pause);
  58.        viewHolder.last=(Button)findViewById(R.id.last);
  59.    }
  60.    
  61.    
  62.    //監聽事件
  63.    void listener(){
  64.        //中止
  65.        viewHolder.stop.setOnClickListener(new OnClickListener() {
  66.         
  67.         @Override
  68.         public void onClick(View v) {
  69.             // TODO Auto-generated method stub
  70.             if(myMediaPlayer.isPlaying()){
  71.                 myMediaPlayer.reset();
  72.             }
  73.         }
  74.     });
  75.        //開始
  76.        viewHolder.start.setOnClickListener(new OnClickListener() {
  77.         
  78.         @Override
  79.         public void onClick(View v) {
  80.             // TODO Auto-generated method stub
  81.             playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  82.         }
  83.     });
  84.        //下一首
  85.        viewHolder.next.setOnClickListener(new OnClickListener() {
  86.         
  87.         @Override
  88.         public void onClick(View v) {
  89.             // TODO Auto-generated method stub
  90.             nextMusic();
  91.         }
  92.     });
  93.        //暫停
  94.        viewHolder.pause.setOnClickListener(new OnClickListener() {
  95.         
  96.         @Override
  97.         public void onClick(View v) {
  98.             // TODO Auto-generated method stub
  99.             if(myMediaPlayer.isPlaying()){
  100.                 myMediaPlayer.pause();
  101.             }else{
  102.                 myMediaPlayer.start();
  103.             }
  104.         }
  105.     });
  106.        //上一首
  107.        viewHolder.last.setOnClickListener(new OnClickListener() {
  108.         
  109.         @Override
  110.         public void onClick(View v) {
  111.             // TODO Auto-generated method stub
  112.             
  113.             lastMusic();
  114.         }
  115.     });
  116.       
  117.    }
  118.    
  119.    //播放音樂
  120.    void playMusic(String path){
  121.        try {
  122.         myMediaPlayer.reset();
  123.         myMediaPlayer.setDataSource(path);
  124.         myMediaPlayer.prepare();
  125.         myMediaPlayer.start();
  126.         myMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
  127.             
  128.             @Override
  129.             public void onCompletion(MediaPlayer mp) {
  130.                 // TODO Auto-generated method stub
  131.                 nextMusic();
  132.             }
  133.         });
  134.     } catch (Exception e) {
  135.         // TODO: handle exception
  136.         e.printStackTrace();
  137.     }
  138.    }
  139.    
  140.    //下一首
  141.    void nextMusic(){
  142.        if(++currentListItem>=myMusicList.size()){
  143.            currentListItem=0;
  144.        }
  145.        else{
  146.            playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  147.        }
  148.    }
  149.    
  150.    //上一首
  151.    void lastMusic(){
  152.        if(currentListItem!=0)
  153.            {
  154.        if(--currentListItem>=0){
  155.            currentListItem=myMusicList.size();
  156.        } else{
  157.            playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  158.        }
  159.           }  else{
  160.            playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  161.        }
  162.    }
  163.    
  164.    //當用戶返回時結束音樂並釋放音樂對象
  165.        @Override
  166.     public boolean onKeyDown(int keyCode, KeyEvent event) {
  167.         // TODO Auto-generated method stub
  168.            if(keyCode==KeyEvent.KEYCODE_BACK){
  169.                myMediaPlayer.stop();
  170.                myMediaPlayer.release();
  171.                this.finish();
  172.                return true;
  173.            }
  174.         return super.onKeyDown(keyCode, event);
  175.     }
  176.    
  177.        //當選擇列表項時播放音樂
  178.        @Override
  179.     protected void onListItemClick(ListView l, View v, int position, long id) {
  180.         // TODO Auto-generated method stub
  181.         currentListItem=position;
  182.         playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  183.     }
  184.    
  185. }
複製代碼

運行效果圖:

4.png



五、Android 模擬器使用SD卡例子中直接指定SD卡里面的音樂文件進行操做,那麼咱們的Android模擬器如何使用SD卡呢?

  • 一、不用操做 DOS 直接使用 Android SDK and AVD Manager 在建立 AVD 時建立一個SD 卡,這樣就能夠實現,不妨親手試試。
建立好SD 卡那如何把文件導入SD 卡里面供模擬器使用呢?
  • 一、啓動程序,運行模擬器。
  • 二、在 Eclipse 上先把 DDMS 窗口,選擇 File Explorer 標籤。
  • 三、若是你當時建立AVD 時有順帶建立 SD 卡或者你經過DOS命令建立的SD 卡,那麼File Explorer 裏面就會顯示一個 "sdcard" 的文件夾,這時選中它,右上角的兩個箭頭就變成可用,右邊箭頭是導入,左邊箭頭是導出。
很少寫了,源碼下載 : musicPlayer.rar