Android简易版音乐播放器

       1. 布局

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="vertical"  
  7.     android:gravity="center_horizontal">  
  8.   
  9.     <Button  
  10.         android:id="@+id/musicList"  
  11.         android:layout_width="match_parent"  
  12.         android:layout_height="wrap_content"  
  13.         android:layout_marginTop="10dp"  
  14.         android:background="#86B2F4"  
  15.         android:text="音乐文件列表"  
  16.         android:textColor="#fff"  
  17.         android:textSize="28sp"/>  
  18.   
  19.     <ImageView  
  20.         android:layout_width="match_parent"  
  21.         android:layout_height="wrap_content"  
  22.         android:src="@drawable/logo"/>  
  23.   
  24.     <SeekBar  
  25.         android:id="@+id/seekBar"  
  26.         android:layout_width="match_parent"  
  27.         android:layout_height="wrap_content"/>  
  28.   
  29.     <LinearLayout  
  30.         android:layout_width="match_parent"  
  31.         android:layout_height="wrap_content"  
  32.         android:gravity="center_horizontal">  
  33.   
  34.         <ImageButton  
  35.             android:id="@+id/stop"  
  36.             android:layout_width="wrap_content"  
  37.             android:layout_height="wrap_content"  
  38.             android:src="@drawable/stop"/>  
  39.   
  40.         <ImageButton  
  41.             android:id="@+id/pre"  
  42.             android:layout_width="wrap_content"  
  43.             android:layout_height="wrap_content"  
  44.             android:src="@drawable/pree"/>  
  45.   
  46.         <ImageButton  
  47.             android:id="@+id/play"  
  48.             android:layout_width="wrap_content"  
  49.             android:layout_height="wrap_content"  
  50.             android:src="@drawable/play"/>  
  51.   
  52.         <ImageButton  
  53.             android:id="@+id/next"  
  54.             android:layout_width="wrap_content"  
  55.             android:layout_height="wrap_content"  
  56.             android:src="@drawable/next"/>  
  57.     </LinearLayout>  
  58. </LinearLayout>  

      2. 工具类

Java代码
  1. /** 
  2.  * Created by  刘楠 on 2016-03-05 19:39. 
  3.  * 文件过滤器工具类, 
  4.  * 用于过滤指定后缀的文件 
  5.  */  
  6. public class MusicFileNameFilter implements FilenameFilter {  
  7.   
  8.     private String type;  
  9.   
  10.     public MusicFileNameFilter(String type) {  
  11.         this.type = type;  
  12.     }  
  13.   
  14.     @Override  
  15.     public boolean accept(File dir, String filename) {  
  16.         return filename.endsWith(type);  
  17.     }  
  18. }  

       3. Binder接口

Java代码
  1. /** 
  2.  * Created by  刘楠 on 2016-03-05 20:41. 
  3.  */  
  4. public interface IMusicPlayerService {  
  5.     public void callplay(String path);  
  6.     ;  
  7.     public  void callStop();  
  8.   
  9.     public boolean callIsPlaying();  
  10.   
  11.     public int callGetgetDuration();  
  12.   
  13.     public int callGetgetCurrentDuration();  
  14.   
  15.     public boolean callMediaIsNull();  
  16.   
  17.     public void callChanageSeek(int position);  
  18.   
  19.     public void callPause();  

       4. Service

Java代码
  1. /** 
  2.  * Created by  刘楠 on 2016-03-05 20:32. 
  3.  * 
  4.  * Servie音乐播放 
  5.  */  
  6. public class MusicPlayerService extends Service {  
  7.   
  8.   
  9.     private MediaPlayer mediaPlayer;  
  10.   
  11.     private MusicPlayerBinder musicPlayerBinder = new MusicPlayerBinder();  
  12.   
  13.     private class MusicPlayerBinder extends Binder implements IMusicPlayerService {  
  14.   
  15.         public void callplay(String path) {  
  16.   
  17.             play(path);  
  18.         }  
  19.   
  20.         @Override  
  21.         public void callStop() {  
  22.             stop();  
  23.         }  
  24.   
  25.         @Override  
  26.         public boolean callIsPlaying() {  
  27.             return isPlaying();  
  28.         }  
  29.   
  30.         @Override  
  31.         public int callGetgetDuration() {  
  32.             return getgetDuration();  
  33.         }  
  34.   
  35.         @Override  
  36.         public int callGetgetCurrentDuration() {  
  37.             return getCurrentDuration();  
  38.         }  
  39.   
  40.         @Override  
  41.         public boolean callMediaIsNull() {  
  42.             return mediaIsNull();  
  43.         }  
  44.   
  45.         @Override  
  46.         public void callChanageSeek(int position) {  
  47.             chanageSeek(position);  
  48.         }  
  49.   
  50.         @Override  
  51.         public void callPause() {  
  52.             pause();  
  53.         }  
  54.   
  55.     }  
  56.   
  57.     @Nullable  
  58.     @Override  
  59.     public IBinder onBind(Intent intent) {  
  60.   
  61.         return musicPlayerBinder;  
  62.     }  
  63.   
  64.     /** 
  65.      * 初始化 
  66.      * @param path 
  67.      */  
  68.     private void init(String path) {  
  69.   
  70.         if (mediaPlayer == null) {  
  71.             mediaPlayer = new MediaPlayer();  
  72.             reset(path);  
  73.         }else{  
  74.             reset(path);  
  75.         }  
  76.     }  
  77.   
  78.     /** 
  79.      * 资源重置 
  80.      * @param path 
  81.      */  
  82.     private void reset(String path) {  
  83.   
  84.             try {  
  85.                 mediaPlayer.reset();  
  86.                 mediaPlayer.setDataSource(path);  
  87.                 mediaPlayer.prepare();  
  88.                 mediaPlayer.setLooping(true);  
  89.                 mediaPlayer.start();  
  90.             } catch (IOException e) {  
  91.                 e.printStackTrace();  
  92.             }  
  93.   
  94.     }  
  95.   
  96.     /** 
  97.      * 播放 
  98.      * @param path 
  99.      */  
  100.     private void play(String path) {  
  101.   
  102.       /*  if (mediaPlayer != null && mediaPlayer.isPlaying()) { 
  103.             mediaPlayer.pause(); 
  104.         } else if (mediaPlayer != null&&!mediaPlayer.isPlaying()) { 
  105.             mediaPlayer.start(); 
  106.         } else { 
  107.             init(path); 
  108.         }*/  
  109.         init(path);  
  110.   
  111.     }  
  112.   
  113.     /** 
  114.      * 是不是在播放 
  115.      * @return 
  116.      */  
  117.     private boolean isPlaying(){  
  118.         if(mediaPlayer!=null) {  
  119.             return mediaPlayer.isPlaying();  
  120.         }  
  121.         return false;  
  122.     }  
  123.   
  124.     /** 
  125.      * 获取总的进度 
  126.      * @return 
  127.      */  
  128.     private int getgetDuration(){  
  129.         return  mediaPlayer.getDuration();  
  130.     }  
  131.   
  132.     /** 
  133.      * 获取当前进度 
  134.      * @return 
  135.      */  
  136.     private int getCurrentDuration(){  
  137.         return mediaPlayer.getCurrentPosition();  
  138.     }  
  139.   
  140.     /** 
  141.      * 暂停 
  142.      */  
  143.     private void pause(){  
  144.         if(mediaPlayer!=null&&mediaPlayer.isPlaying()){  
  145.             mediaPlayer.pause();  
  146.         }else if(mediaPlayer!=null&&!mediaPlayer.isPlaying()){  
  147.             mediaPlayer.start();  
  148.         }  
  149.     }  
  150.   
  151.     /** 
  152.      * 停止 
  153.      */  
  154.     private void stop(){  
  155.         if(mediaPlayer!=null){  
  156.             mediaPlayer.stop();  
  157.             mediaPlayer.release();  
  158.             mediaPlayer=null;  
  159.   
  160.         }  
  161.     }  
  162.   
  163.     /** 
  164.      * 判断当前是不是NULL 
  165.      * @return 
  166.      */  
  167.     private boolean mediaIsNull(){  
  168.         return  mediaPlayer==null;  
  169.     }  
  170.   
  171.     private void chanageSeek(int position){  
  172.         mediaPlayer.seekTo(position);  
  173.         mediaPlayer.start();  
  174.     }  
  175.   
  176.   
  177. }  

       5. Activity

Java代码
  1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {  
  2.         //音乐文件的目录  
  3.         private static final String PATH = Environment.getExternalStorageDirectory() + "/Music/";  
  4.         private static final String TAG = "MainActivity";  
  5.         //文件路径  
  6.         private ArrayList<String> fileList = new ArrayList<String>();  
  7.         //文件名  
  8.         private ArrayList<String> fileNameList = new ArrayList<String>();  
  9.   
  10.         /* 
  11.         进度条 
  12.          */  
  13.         private SeekBar seekBar;  
  14.         /* 
  15.         音乐文件列表 
  16.          */  
  17.         private Button musicList;  
  18.   
  19.         /* 
  20.         音乐控制按键 
  21.          */  
  22.         private ImageButton stop;  
  23.         private ImageButton pre;  
  24.         private ImageButton play;  
  25.         private ImageButton next;  
  26.         //单首音乐的路径  
  27.         private String musicPath;  
  28.   
  29.         private IMusicPlayerService mPlayerService;  
  30.   
  31.         private MusicPlayerServiceConnection mConn;  
  32.   
  33.         private boolean mBound =false;  
  34.   
  35.   
  36.         @Override  
  37.         protected void onCreate(Bundle savedInstanceState) {  
  38.             super.onCreate(savedInstanceState);  
  39.             setContentView(R.layout.activity_main);  
  40.             /* 
  41.             初始化 
  42.              */  
  43.             seekBar = (SeekBar) findViewById(R.id.seekBar);  
  44.   
  45.             musicList = (Button) findViewById(R.id.musicList);  
  46.   
  47.             stop = (ImageButton) findViewById(R.id.stop);  
  48.             pre = (ImageButton) findViewById(R.id.pre);  
  49.             ;  
  50.             play = (ImageButton) findViewById(R.id.play);  
  51.             ;  
  52.             next = (ImageButton) findViewById(R.id.next);  
  53.             ;  
  54.   
  55.   
  56.             File file = new File(PATH);  
  57.   
  58.             //获取文件列表  
  59.             File[] arrs = file.listFiles(new MusicFileNameFilter(".mp3"));  
  60.   
  61.             for (File f : arrs) {  
  62.                 //添加全路径到文件列表  
  63.                 fileList.add(f.getAbsolutePath());  
  64.                 //添加文件表到文件列表  
  65.                 fileNameList.add(f.getName());  
  66.   
  67.             }  
  68.   
  69.             /* 
  70.             设置监听器 
  71.              */  
  72.             musicList.setOnClickListener(this);  
  73.             stop.setOnClickListener(this);  
  74.             pre.setOnClickListener(this);  
  75.             play.setOnClickListener(this);  
  76.             next.setOnClickListener(this);  
  77.   
  78.   
  79.   
  80.             seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {  
  81.                 @Override  
  82.                 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {  
  83.   
  84.                 }  
  85.   
  86.                 @Override  
  87.                 public void onStartTrackingTouch(SeekBar seekBar) {  
  88.   
  89.                 }  
  90.                 //拖动进度条,改变播放进度  
  91.                 @Override  
  92.                 public void onStopTrackingTouch(SeekBar seekBar) {  
  93.                     mPlayerService.callChanageSeek(seekBar.getProgress());  
  94.                 }  
  95.             });  
  96.   
  97.         }  
  98.   
  99.         @Override  
  100.         protected void onStart() {  
  101.             super.onStart();  
  102.             if(mConn==null){  
  103.                 mConn= new MusicPlayerServiceConnection();  
  104.             }  
  105.             Intent intent = new Intent(this,MusicPlayerService.class);  
  106.             mBound = bindService(intent, mConn, BIND_AUTO_CREATE);  
  107.   
  108.         }  
  109.   
  110.         @Override  
  111.         public void onClick(View v) {  
  112.             switch (v.getId()) {  
  113.                 case R.id.musicList:  
  114.                     showList();  
  115.                     break;  
  116.                 case R.id.stop:  
  117.                     stop();  
  118.                     break;  
  119.                 case R.id.pre:  
  120.                     pre();  
  121.                     break;  
  122.                 case R.id.play:  
  123.                     play();  
  124.                     break;  
  125.                 case R.id.next:  
  126.                     next();  
  127.                     break;  
  128.             }  
  129.   
  130.         }  
  131.         /* 
  132.         下一首 
  133.          */  
  134.         private void next() {  
  135.             int index = fileList.indexOf(musicPath);  
  136.             if(index>=fileList.size()){  
  137.                 index=0;  
  138.             }  
  139.             mPlayerService.callplay(fileList.get(index+1));  
  140.         }  
  141.   
  142.         /* 
  143.         播放 
  144.          */  
  145.         private void play() {  
  146.             Log.d(TAG, "mBound" + mBound);  
  147.             boolean isNull = mPlayerService.callMediaIsNull();  
  148.             if(isNull) {  
  149.                 mPlayerService.callplay(musicPath);  
  150.             }else{  
  151.                 mPlayerService.callPause();  
  152.             }  
  153.   
  154.             if(mPlayerService.callIsPlaying()){  
  155.                 play.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.pause));  
  156.             }else{  
  157.                 play.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.play));  
  158.             }  
  159.   
  160.             //更新进度  
  161.             new Thread(){  
  162.   
  163.                 boolean isFinished=mPlayerService.callIsPlaying();  
  164.                 @Override  
  165.                 public void run() {  
  166.                     if(isFinished) {  
  167.                         while (isFinished) {  
  168.                             SystemClock.sleep(200);  
  169.                             int currentDuration = mPlayerService.callGetgetCurrentDuration();  
  170.                             int duration = mPlayerService.callGetgetDuration();  
  171.                             seekBar.setMax(duration);  
  172.                             seekBar.setProgress(currentDuration);  
  173.                             if (currentDuration >= duration) {  
  174.                                 isFinished = false;  
  175.                             }  
  176.                         }  
  177.                     }  
  178.   
  179.                 }  
  180.             }.start();  
  181.         }  
  182.   
  183.         /** 
  184.          * 上一首 
  185.          */  
  186.         private void pre() {  
  187.             int index = fileList.indexOf(musicPath);  
  188.             if(index<=0){  
  189.                 index=fileList.size()-1;  
  190.             }  
  191.             mPlayerService.callplay(fileList.get(index-1));  
  192.         }  
  193.   
  194.         /** 
  195.          * 停止播放 
  196.          */  
  197.         private void stop() {  
  198.             mPlayerService.callStop();  
  199.         }  
  200.   
  201.         /** 
  202.          * 显示音乐列表 
  203.          */  
  204.         private void showList() {  
  205.   
  206.             Intent intent = new Intent(this,MusicListActivity.class);  
  207.             //intent.putStringArrayListExtra("filelist",fileList);  
  208.             intent.putStringArrayListExtra("filenamelist",fileNameList);  
  209.   
  210.             startActivityForResult(intent,100);  
  211.   
  212.         }  
  213.   
  214.         @Override  
  215.         protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  216.             super.onActivityResult(requestCode, resultCode, data);  
  217.   
  218.             if(data==null){  
  219.                 Toast.makeText(MainActivity.this"没有结果", Toast.LENGTH_SHORT).show();  
  220.                 return;  
  221.             }  
  222.             //获取下标  
  223.             int position = data.getIntExtra("position"0);  
  224.             //设置音乐路径  
  225.             musicPath = fileList.get(position);  
  226.            // play();  
  227.             Log.d(TAG,musicPath);  
  228.         }  
  229.   
  230.         private class MusicPlayerServiceConnection implements ServiceConnection{  
  231.   
  232.             @Override  
  233.             public void onServiceConnected(ComponentName name, IBinder service) {  
  234.                 mPlayerService = (IMusicPlayerService) service;  
  235.   
  236.   
  237.             }  
  238.   
  239.             @Override  
  240.             public void onServiceDisconnected(ComponentName name) {  
  241.                 if(mConn!=null){  
  242.                  mConn =null;  
  243.                 }  
  244.             }  
  245.         }  
  246.   
  247.         @Override  
  248.         protected void onStop() {  
  249.             super.onStop();  
  250.             if(mConn!=null){  
  251.                 unbindService(mConn);  
  252.                 mConn=null;  
  253.                 mPlayerService=null;  
  254.             }  
  255.         }  
  256.   
  257.         @Override  
  258.         protected void onDestroy() {  
  259.             super.onDestroy();  
  260.             if(mConn!=null){  
  261.                 unbindService(mConn);  
  262.                 mConn=null;  
  263.                 mPlayerService=null;  
  264.             }  
  265.         }  
  266.     }  
本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/example/547.html
2016年3月21日
发布:鸡啄米 分类:Android开发实例 浏览: 评论:0