<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center_horizontal"> <Button android:id="@+id/musicList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:background="#86B2F4" android:text="音乐文件列表" android:textColor="#fff" android:textSize="28sp"/> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/logo"/> <SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal"> <ImageButton android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/stop"/> <ImageButton android:id="@+id/pre" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/pree"/> <ImageButton android:id="@+id/play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/play"/> <ImageButton android:id="@+id/next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/next"/> </LinearLayout> </LinearLayout>
/** * Created by 刘楠 on 2016-03-05 19:39. * 文件过滤器工具类, * 用于过滤指定后缀的文件 */ public class MusicFileNameFilter implements FilenameFilter { private String type; public MusicFileNameFilter(String type) { this.type = type; } @Override public boolean accept(File dir, String filename) { return filename.endsWith(type); } }
/** * Created by 刘楠 on 2016-03-05 20:41. */ public interface IMusicPlayerService { public void callplay(String path); ; public void callStop(); public boolean callIsPlaying(); public int callGetgetDuration(); public int callGetgetCurrentDuration(); public boolean callMediaIsNull(); public void callChanageSeek(int position); public void callPause(); } 4. service /** * Created by 刘楠 on 2016-03-05 20:32. * * Servie音乐播放 */ public class MusicPlayerService extends Service { private MediaPlayer mediaPlayer; private MusicPlayerBinder musicPlayerBinder = new MusicPlayerBinder(); private class MusicPlayerBinder extends Binder implements IMusicPlayerService { public void callplay(String path) { play(path); } @Override public void callStop() { stop(); } @Override public boolean callIsPlaying() { return isPlaying(); } @Override public int callGetgetDuration() { return getgetDuration(); } @Override public int callGetgetCurrentDuration() { return getCurrentDuration(); } @Override public boolean callMediaIsNull() { return mediaIsNull(); } @Override public void callChanageSeek(int position) { chanageSeek(position); } @Override public void callPause() { pause(); } } @Nullable @Override public IBinder onBind(Intent intent) { return musicPlayerBinder; } /** * 初始化 * @param path */ private void init(String path) { if (mediaPlayer == null) { mediaPlayer = new MediaPlayer(); reset(path); }else{ reset(path); } } /** * 资源重置 * @param path */ private void reset(String path) { try { mediaPlayer.reset(); mediaPlayer.setDataSource(path); mediaPlayer.prepare(); mediaPlayer.setLooping(true); mediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); } } /** * 播放 * @param path */ private void play(String path) { /* if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); } else if (mediaPlayer != null&&!mediaPlayer.isPlaying()) { mediaPlayer.start(); } else { init(path); }*/ init(path); } /** * 是不是在播放 * @return */ private boolean isPlaying(){ if(mediaPlayer!=null) { return mediaPlayer.isPlaying(); } return false; } /** * 获取总的进度 * @return */ private int getgetDuration(){ return mediaPlayer.getDuration(); } /** * 获取当前进度 * @return */ private int getCurrentDuration(){ return mediaPlayer.getCurrentPosition(); } /** * 暂停 */ private void pause(){ if(mediaPlayer!=null&&mediaPlayer.isPlaying()){ mediaPlayer.pause(); }else if(mediaPlayer!=null&&!mediaPlayer.isPlaying()){ mediaPlayer.start(); } } /** * 停止 */ private void stop(){ if(mediaPlayer!=null){ mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer=null; } } /** * 判断当前是不是NULL * @return */ private boolean mediaIsNull(){ return mediaPlayer==null; } private void chanageSeek(int position){ mediaPlayer.seekTo(position); mediaPlayer.start(); } }
public class MainActivity extends AppCompatActivity implements View.OnClickListener { //音乐文件的目录 private static final String PATH = Environment.getExternalStorageDirectory() + "/Music/"; private static final String TAG = "MainActivity"; //文件路径 private ArrayList<String> fileList = new ArrayList<String>(); //文件名 private ArrayList<String> fileNameList = new ArrayList<String>(); /* 进度条 */ private SeekBar seekBar; /* 音乐文件列表 */ private Button musicList; /* 音乐控制按键 */ private ImageButton stop; private ImageButton pre; private ImageButton play; private ImageButton next; //单首音乐的路径 private String musicPath; private IMusicPlayerService mPlayerService; private MusicPlayerServiceConnection mConn; private boolean mBound =false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /* 初始化 */ seekBar = (SeekBar) findViewById(R.id.seekBar); musicList = (Button) findViewById(R.id.musicList); stop = (ImageButton) findViewById(R.id.stop); pre = (ImageButton) findViewById(R.id.pre); ; play = (ImageButton) findViewById(R.id.play); ; next = (ImageButton) findViewById(R.id.next); ; File file = new File(PATH); //获取文件列表 File[] arrs = file.listFiles(new MusicFileNameFilter(".mp3")); for (File f : arrs) { //添加全路径到文件列表 fileList.add(f.getAbsolutePath()); //添加文件表到文件列表 fileNameList.add(f.getName()); } /* 设置监听器 */ musicList.setOnClickListener(this); stop.setOnClickListener(this); pre.setOnClickListener(this); play.setOnClickListener(this); next.setOnClickListener(this); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } //拖动进度条,改变播放进度 @Override public void onStopTrackingTouch(SeekBar seekBar) { mPlayerService.callChanageSeek(seekBar.getProgress()); } }); } @Override protected void onStart() { super.onStart(); if(mConn==null){ mConn= new MusicPlayerServiceConnection(); } Intent intent = new Intent(this,MusicPlayerService.class); mBound = bindService(intent, mConn, BIND_AUTO_CREATE); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.musicList: showList(); break; case R.id.stop: stop(); break; case R.id.pre: pre(); break; case R.id.play: play(); break; case R.id.next: next(); break; } } /* 下一首 */ private void next() { int index = fileList.indexOf(musicPath); if(index>=fileList.size()){ index=0; } mPlayerService.callplay(fileList.get(index+1)); } /* 播放 */ private void play() { Log.d(TAG, "mBound" + mBound); boolean isNull = mPlayerService.callMediaIsNull(); if(isNull) { mPlayerService.callplay(musicPath); }else{ mPlayerService.callPause(); } if(mPlayerService.callIsPlaying()){ play.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.pause)); }else{ play.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.play)); } //更新进度 new Thread(){ boolean isFinished=mPlayerService.callIsPlaying(); @Override public void run() { if(isFinished) { while (isFinished) { SystemClock.sleep(200); int currentDuration = mPlayerService.callGetgetCurrentDuration(); int duration = mPlayerService.callGetgetDuration(); seekBar.setMax(duration); seekBar.setProgress(currentDuration); if (currentDuration >= duration) { isFinished = false; } } } } }.start(); } /** * 上一首 */ private void pre() { int index = fileList.indexOf(musicPath); if(index<=0){ index=fileList.size()-1; } mPlayerService.callplay(fileList.get(index-1)); } /** * 停止播放 */ private void stop() { mPlayerService.callStop(); } /** * 显示音乐列表 */ private void showList() { Intent intent = new Intent(this,MusicListActivity.class); //intent.putStringArrayListExtra("filelist",fileList); intent.putStringArrayListExtra("filenamelist",fileNameList); startActivityForResult(intent,100); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(data==null){ Toast.makeText(MainActivity.this, "没有结果", Toast.LENGTH_SHORT).show(); return; } //获取下标 int position = data.getIntExtra("position", 0); //设置音乐路径 musicPath = fileList.get(position); // play(); Log.d(TAG,musicPath); } private class MusicPlayerServiceConnection implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { mPlayerService = (IMusicPlayerService) service; } @Override public void onServiceDisconnected(ComponentName name) { if(mConn!=null){ mConn =null; } } } @Override protected void onStop() { super.onStop(); if(mConn!=null){ unbindService(mConn); mConn=null; mPlayerService=null; } } @Override protected void onDestroy() { super.onDestroy(); if(mConn!=null){ unbindService(mConn); mConn=null; mPlayerService=null; } } }