title:简易版本音乐播放器
简易版本音乐播放器
1.布局
<?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>
2.工具类
/**
* 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);
}
}
3.Binder接口
/**
* 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();
}
}
5.Activity
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;
}
}
}