学习安卓开发有一年了,想想这一年的努力,确实也收获了不少。也找到了比較如意的工作。
今天准备分享一个以前在初学阶段练习的一个项目。通过这个项目我真正的找到了开发安卓软件的感觉,从此逐渐步入安卓开发的正规。这个项目是当时借鉴Mars老师的初学视频做的安州手机的MP3播放器。自己又进行了改进,特别在歌词的优化和加入进度条方面的。因为是8个月前做的,水平非常0基础,bug应该非常多,如今自己又懒得再一次改进,仅仅希望可以给初学的朋友们提供一些帮助。或者起到抛砖引玉的效果。那我就心惬意足了。
先整体介绍下这个MP3播放器。非常easy,首先是本地列表页面(界面非常low,大家不要笑):
列表左边是歌曲名,右边是对应的歌曲大小(字节)。
点击一首歌曲,进入播放页面,就能够播放、暂停和停止音乐。任意调整进度条调整歌曲播放的进度,歌词也相应调整:
首先从本地音乐列表入手来谈,比較简单先看代码:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class LocalMp3Activity extends ListActivity{
List<MP3Info> mp3Infos = null;
SimpleAdapter simpleAdapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.localmp3);
}
/**
* 每次启动本地列表页面又一次加载本地MP3
*/
@Override
protected void onResume() {
FileUtil fileutil = new FileUtil();
mp3Infos = fileutil.getMp3("mp3/");
// for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {/
// MP3Info mp3Info = (MP3Info) iterator.next();
// Log.d("yinan", "LocalMp3Activity--------"+mp3Info.toString());
// }
if(mp3Infos.size() == 0){
Toast.makeText(this, "没有本地音乐", 0).show();
simpleAdapter = buildAdapter(mp3Infos);
setListAdapter(simpleAdapter);
}else{
simpleAdapter = buildAdapter(mp3Infos);
setListAdapter(simpleAdapter);
}
super.onResume();
}
/**
* 封装了ListView的适配器
* @param mp3Infos
* @return
*/
private SimpleAdapter buildAdapter(List<MP3Info> mp3Infos){
List<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {
MP3Info mp3Info = (MP3Info)iterator.next();
HashMap<String,String> map = new HashMap<String,String>();
map.put("mp3_name", mp3Info.getMp3Name());
map.put("mp3_size", mp3Info.getMp3Size());
list.add(map);
}
SimpleAdapter simpleAdapter = new SimpleAdapter(this,list,R.layout.locallist,new String[]{"mp3_name","mp3_size"},new int[]{R.id.mp3_name,R.id.mp3_size});
return simpleAdapter;
}
/**
* 实现ListView的列表点击事件
*/
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
if(mp3Infos != null){
MP3Info mp3Info = mp3Infos.get(position);
Intent intent = new Intent();
intent.putExtra("mp3Info", mp3Info);
intent.setClass(this, PlayActivity.class);
startActivity(intent);
}
}
}
看到加载本地MP3这里有一个FileUtil类,是这个程序处理文件的类,看看getMp3方法怎样实现:
/**获取手机sd卡文件夹下path文件夹下的以“MP3”为后缀的文件,返回mp3文件集合
* 不仅获得了歌曲文件名称,还获得了相应的歌词文件名称
* @param path
* @return
*/
public List<MP3Info> getMp3(String path){
List<MP3Info> mp3Infos = new ArrayList<MP3Info>();
//
File f = new File(SDPATH+"/"+path);
File[] files = f.listFiles();
for (int i = 0; i < files.length; i++) {
//获取名字包括mp3字样的文件
if(files[i].getName().indexOf("mp3")>0){
MP3Info mp3Info = new MP3Info();
mp3Info.setMp3Name(files[i].getName());
mp3Info.setMp3Size(files[i].length()+"");
//以.为标志将文件名称分开。存入字符串数组
String s[] = mp3Info.getMp3Name().split("\\.");
String lrcName = s[0]+".lrc";
mp3Info.setLrcName(lrcName);
mp3Infos.add(mp3Info);
}
}
//}
return mp3Infos;
}
}
当中
String SDPATH = Environment.getExternalStorageDirectory() + "";
每次进入本地列表,都会调用Activity的onResume方法。随后载入全部本地MP3歌曲的信息。然后通过一个SimpleAdapter,将MP3的信息显示出来。最后为列表加入了点击事件。该点击事件是点击某歌曲进入播放列表的事件。
好了。第一部分很easy,第二部分我们再来看关于音乐播放部分。