今天制作了一个属于自己的音乐播放器感觉还不错,分享出来,希望能够帮助大家。感觉知识点挺多的,也挺使用的,大大提高了个人兴趣,哈哈,我是程序员啊程序员。
为了有所侧重,我将注意点和学习点放在文章的最开篇。
一、学习重点与注意点
1、Mediaplayer的生命周期、相关方法及其使用
2、如何自定义SeekBar
3、接收广播的动态注册与注销
4、获取文件路径
5、获取歌曲的名称、作者名、图片
6、Service服务的使用
二、Mediaplayer介绍
想要制作一个属于自己的风格样式的音乐播放器,首先我们要学会使用音乐播放器。
Mediaplayer的生命周期
具体的查看API,这里附一张生命周期图。
Mediaplayer的证明周期中我们可以看出,Mediaplayer开始的时候需要调用reset()方法,然后是setDataResource()-prepare()-start()在MediaPlayer开启之后,我们可以让它暂停和停止等操作。
reset():将Mediaplayer对象重置到刚刚创建的状态。
setDataResource():设置要播放的音频文件的位置。
prepare():在开始播放之前调用这个方法完成准备工作(使用之前需要设置prepare监听)。
start():开始或继续播放音频文件
seekTo():从指定位置开始播放
stop():停止播放音频。
getDuration():获取载入的音频文件的时长
getCurrentPosition():获取音频文件的当前播放位置
简单的使用方法
点击按钮设置音频播放
public class MainActivity extends Activity implements OnClickListener{
private Button mbtn_start;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mbtn_start=(Button) findViewById(R.id.bt_start);
mbtn_start.setOnClickListener(this);
//获取文件路径,如果我们不知道文件具体放在那里可以通过log打印出来
File musicDir=Environment.getExternalStorageDirectory();
Log.d("音乐", Environment.getExternalStorageDirectory().getAbsolutePath());
musicDir = new File(musicDir, "/musics");
Toast.makeText(getApplicationContext(), Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath(),
Toast.LENGTH_LONG).show();
File[] files=musicDir.listFiles();//获取所有的文件
for(File file:files){
Log.d("路径", file.getAbsolutePath());
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_start:
//new 一个新Mediaplayer对象,按照生命周期顺序操作
MediaPlayer mediaplayer=new MediaPlayer();
mediaplayer.reset();
File musicDir=Environment.getExternalStorageDirectory();
File[] files=musicDir.listFiles();//获取所有的文件
for(File file:files){
Log.d("路径", file.getAbsolutePath());
}
try {
mediaplayer.setDataSource(files[23].getAbsolutePath());
mediaplayer.prepare();
//设置prepare监听器,查看是否准备好,可以开始?
mediaplayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) { //准备好了之后开始播放
mp.start();
}
});
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
default:
break;
}
}
}
注意:我们还需要在manifest中获取读sdcard的权限。
三、制作音频播放器
Ⅰ 开启音乐并使音乐能够在后台运行
1、制作布局,ListView(+子布局+Adapter)+SeekBar+TextView+ToggleButton
2、循序渐进:书写MusicService类继承Service (这里别忘记在manifest中注册),为了保证音乐能够在后台运行,在之后的步骤中我们将在MusicService中创建线程,开启音乐。
3、开启MusicService:在MainActivity中获得文件路径,通过Intent的putStringArrayListExtra的方法传递给MusicService,并监听listview的item点击事件找到要播放的文件的position传递给Service。
4、在MusicService中创建线程,开启音乐
①布局+ListView+子布局+Adapter
在布局中我们顺便学习一下自定义SeekBar样式
新建xml文件,设置点击图片
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/list_btn_radio_check_on" android:state_focused="true" android:state_window_focused="true"></item>
<item android:drawable="@drawable/list_btn_radio_check_on" android:state_selected="true" android:state_window_focused="true"></item>
<item android:drawable="@drawable/list_btn_radio_check_on" android:state_pressed="true" android:state_window_focused="true"></item>
<item android:drawable="@drawable/list_btn_radio_check_off" ></item>
</selector>
SeekBar引用(通过设置Thumb)
<SeekBar
android:id="@+id/seekbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:progress="20"
android:thumb="@drawable/seekbarimg"
android:layout_weight="1"/>
Adapter
public class MusicAdapter extends BaseAdapter {
private LayoutInflater minflate;
//传递所有文件路径
private File[] musicDirs;
public MusicAdapter(LayoutInflater minflate, File[] musicDirs) {
super();
this.minflate = minflate;
this.musicDirs = musicDirs;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return musicDirs.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh = null;
if (convertView == null) {
vh = new ViewHolder();
convertView = minflate.inflate(R.layout.item_music_name, null);
vh.mtextview = (TextView) convertView
.findViewById(R.id.textview_music_name);
vh.mtextview_author = (TextView) convertView
.findViewById(R.id.textview_author_name);
vh.img = (ImageView) convertView.findViewById(R.id.img);
convertView.setTag(vh);
} else {
vh = (ViewHolder) convertView.getTag();
}
vh.mtextview.setText(musicDirs[position].getName());
//通过MediaMetadataRetriever的对象来获取音频文件的
//歌名、歌手、自带的图片
Me