您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
安卓第十七天笔记--简易版本音乐播放器
 
作者:森林森 来自于:博客园 发布于 2016-4-1
  1465  次浏览      16
 

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接口

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;
}
}
}

   
1465 次浏览       16
 
相关文章

手机软件测试用例设计实践
手机客户端UI测试分析
iPhone消息推送机制实现与探讨
Android手机开发(一)
 
相关文档

Android_UI官方设计教程
手机开发平台介绍
android拍照及上传功能
Android讲义智能手机开发
相关课程

Android高级移动应用程序
Android系统开发
Android应用开发
手机软件测试
最新课程计划
信息架构建模(基于UML+EA)3-21[北京]
软件架构设计师 3-21[北京]
图数据库与知识图谱 3-25[北京]
业务架构设计 4-11[北京]
SysML和EA系统设计与建模 4-22[北京]
DoDAF规范、模型与实例 5-23[北京]

android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   

Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合

领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...