android音乐播放器
学习了handler和ListView后,我做了一个音乐播放器。
音乐播放器有两个界面activity,主界面是音乐文件列表,进入主界面后自动获取系统拥有的音乐mp3文件,然后把mp3的数据信息整理好,用一个ListView呈现给用户。
可以获取mp3的歌名、作者名与系统文件路径。
随机点击一个音乐文件进入了第二个页面:播放页面,播放页面有3个按钮,分别是:上一首歌、下一首歌与播放暂停,还有一个进度条SeekBar:调控歌曲播放进度。
主界面XML代码:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30sp"
android:gravity="center"
android:id="@+id/title"
android:text="音乐播放器" />
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:id="@+id/list"
/>
ListView里面每一个item的XML:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/author"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/title"
android:textSize="25sp"
android:layout_below="@id/author"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image"
android:layout_alignParentRight="true"
/>
播放页面XML代码:
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="上一首"
android:id="@+id/presong"
android:onClick="onClick"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="暂停"
android:id="@+id/control"
android:onClick="onClick"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="下一首"
android:id="@+id/nextsong"
android:onClick="onClick"
/>
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/seekbar"
android:max="100"
/>
主页面activity的onCreate()方法初始化对象,获取XML页面组建的id,设置监听:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_music);
urlmap = new HashMap<String,String>();
listView = (ListView) findViewById(R.id.list);
String[] keys = {"author","title","image"};
int[] ids = {R.id.author,R.id.title,R.id.image};
SimpleAdapter adapter = new SimpleAdapter(this, getInfo(), R.layout.item, keys, ids);
listView.setAdapter(adapter);
listView.setOnItemClickListener(click_listener);
}
public List<Map<String,Object>> getInfo(){
list = new ArrayList<Map<String,Object>>();
musicCursor = this.getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
null,
null,
null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
while(musicCursor.moveToNext()){
String title = musicCursor.getString(musicCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
String author = musicCursor.getString(musicCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
String url = musicCursor.getString(musicCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
Map<String,Object> map = new HashMap<String,Object>();
map.put("author", author);
map.put("title", title);
map.put("image", R.drawable.ic_launcher);
urlmap.put(title, url);
list.add(map);
}
return list;
}
创建一个ListView的item监听器,监听item,当ListView里面的任意一个mp3文件被点击,立即进入播放界面,并且开始播放:
OnItemClickListener click_listener = new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
post = position;
if(flag){
mp.reset();
}
flag = true;
mp = new MediaPlayer();
String title = ((TextView)view.findViewById(R.id.title)).getText().toString();
String url = urlmap.get(title);
try {
mp.setDataSource(url);
mp.prepare();
mp.start();
Intent intent = new Intent(MainActivity.this,Play_page.class);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
};
进入了播放页面activity,onCreate()方法一样是初始化对象,获取SeekBar的id,然后设置与音乐事件一样大小的SeekBar长度,最后设置监听:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.play_page);
sb = (SeekBar)findViewById(R.id.seekbar);
endtime = mp.getDuration();
sb.setMax(endtime);
sb.setOnSeekBarChangeListener(ocl);
}
在onStart()方法里面控制handler,用于调节进度条,使进度条跟随mp3播放进度改变而改变,然后创建一个SeekBar监听,监听进度条的改变,改变之后,歌曲的播放进度也随之改变:
<span style="white-space:pre"> </span>protected void onStart() {
super.onStart();
handler.post(new Runnable(){
public void run() {
sb.setProgress(mp.getCurrentPosition());
handler.postDelayed(this, 1000);
}
});
};
OnSeekBarChangeListener ocl = new OnSeekBarChangeListener() {
public void onStopTrackingTouch(SeekBar arg0) {}
public void onStartTrackingTouch(SeekBar arg0) {}
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
mp.seekTo(sb.getProgress());
}
};
最后就是实现上一曲、下一曲与暂停播放按钮了,在主界面监听ListView里面可以获得当前播放mp的位置排序position,然后记录下来,在上一曲与下一曲就可以通过position来改变当前的位置,暂停播放就是pause()与start()两个方法:
<span style="white-space:pre"> </span>public void onClick(View v) {
int id = v.getId();
switch(id){
case R.id.control:
Button bt = (Button) findViewById(R.id.control);
if( bt.getText().toString().equals("暂停") ){
bt.setText("播放");
mp.pause();
}else{
bt.setText("暂停");
mp.start();
}
break;
case R.id.presong:
post --;
if(post < 0){
post = list.size()-1;
}
HashMap<String,Object> map = (HashMap<String, Object>) list.get(post);
String title = (String) map.get("title");
String url = urlmap.get(title);
mp.release();
mp = new MediaPlayer();
try{
mp.setDataSource(url);
mp.prepare();
mp.start();
}catch(Exception e){
e.printStackTrace();
}
break;
case R.id.nextsong:
post ++;
post = post%list.size();
HashMap<String,Object> nextsongmap = (HashMap<String, Object>) list.get(post);
String nextsongtitle = (String) nextsongmap.get("title");
String nextsongurl = urlmap.get(nextsongtitle);
mp.release();
mp = new MediaPlayer();
try{
mp.setDataSource(nextsongurl);
mp.prepare();
mp.start();
}catch(Exception e){
e.printStackTrace();
}
break;
}
}
音乐播放器效果如下: