这是一篇转载的文章,原文章的地址我记住,不过感谢原来的作者。
得到SD卡上的所有音频文件,除了使用之前使用的遍历的方法之外,android提供了更加专业的方式直接查询得到音频文件。
得到音频文件之后,可以通过ListView显示一些文件的基本属性:歌手、唱片图片、播放时间长度等等信息。
看了一遍代码,好几个类和方法没有明白具体什么意思。
首先是布局文件:activity_main.xml
android:layout_width="match_parent"
android:layout_height="match_parent" >
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10sp" >
显示列表的布局文件:musiclist.xml
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
android:layout_width="50sp"
android:layout_height="50sp"
android:orientation="vertical" android:gravity="center" >
android:id="@+id/listImage"
android:layout_width="40sp"
android:layout_height="40sp" />
android:layout_width="match_parent"
android:layout_height="50sp"
android:orientation="vertical" >
android:id="@+id/listName"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:singleLine="true"
android:textSize="16sp" />
android:id="@+id/list_Singer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:singleLine="true"
android:textSize="13sp" />
音频文件实体类:
public class MusicInfo {
private int musicIndex; //排序号
private int musicAlubmId;//专辑ID
private String musicName;// 歌曲名
private String musicSinger;// 歌手名
private int musicTime;// 歌曲时间长度
private String musicAlubm;// 专辑名称
private int musicSize;// 歌曲大小
private String musicPath;// 歌曲路径
}
其中的get和set方法就不写了。
主Activity类:
public class MainActivity extends Activity {
public MusicAdapter mAdapter;
private ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.listView);
mAdapter = new MusicAdapter(this);
mListView.setAdapter(mAdapter);
}
}
适配器类:
public class MusicAdapter extends BaseAdapter {
// 用来获得ContentProvider(共享数据库)
public ContentResolver cr;
// 用来装查询到的音乐文件数据
public Cursor cur;
// 歌曲信息列表
public List musicList;
public Context context;
public MusicAdapter(Context context) {
this.context = context;
// 取得数据库对象
cr = context.getContentResolver();
musicList = new ArrayList();
//要查询哪些字段
String[] mString = new String[] { MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.SIZE,
MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.DATA };
// 查询所有音乐信息
cur = cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mString,
null, null, null);
if (cur != null) {
// 移动游标到第一个
cur.moveToFirst();
int j = 1;
//遍历所有查询到的记录
for (int i = 0; i < cur.getCount(); i++) {
if (cur.getString(0).endsWith(".mp3")) {// 过滤获取MP3文件
MusicInfo mInfo = new MusicInfo();
String musicName = cur.getString(0).substring(0,
cur.getString(0).lastIndexOf(".mp3"));
mInfo.setMusicIndex(j++);
mInfo.setMusicName(musicName);
mInfo.setMusicAlubm(cur.getString(1));
mInfo.setMusicSinger(cur.getString(2));
mInfo.setMusicTime(cur.getInt(3));
mInfo.setMusicSize(cur.getInt(4));
mInfo.setMusicId(cur.getInt(5));
mInfo.setMusicPath(cur.getString(6));
musicList.add(mInfo);
}
cur.moveToNext();
}
}
}
//下面这三个方法是BaseAdapter中方法的覆写,不太明白是什么意思
/**
* 得到音频文件的数量
*/
public int getCount() {
return musicList.size();
}
/**
* 得到指定序号的音频文件
*/
public Object getItem(int arg0) {
return musicList.get(arg0);
}
/**
* 得到指定的序号ID
*/
public long getItemId(int arg0) {
return arg0;
}
public View getView(int arg0, View arg1, ViewGroup arg2) {
LayoutInflater mlistLayout = LayoutInflater.from(context);
View mlistView = mlistLayout.inflate(R.layout.musiclist, null);
TextView songName = (TextView) mlistView.findViewById(R.id.listName);
TextView singerName = (TextView) mlistView.findViewById(R.id.list_Singer);
ImageView songImage = (ImageView) mlistView.findViewById(R.id.listImage);
int mid = musicList.get(arg0).getMusicIndex();//取得音频文件的排序号
String musicName = musicList.get(arg0).getMusicName();
String musciSinger = musicList.get(arg0).getMusicSinger();
if (musciSinger.contains("")) {
musciSinger = "";
}
Bitmap img = getAlbumArt(musicList.get(arg0).getMusicId());
songName.setText(mid + ". " + musicName);
singerName.setText(musciSinger);
songImage.setImageBitmap(img);
return mlistView;
}
/**
* 歌曲专辑图片显示,如果有歌曲图片,才会返回,否则为返回默认的图片
* @param albumId
* @return 返回类型Bitmap
*/
public Bitmap getAlbumArt(int albumId) {// albumId是音乐专辑的id
Bitmap bitmap = null;
Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, albumId);
try {
bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), albumArtUri);
bitmap = Bitmap.createScaledBitmap(bitmap, 30, 30, true);
} catch(Exception e){
e.printStackTrace();
//如果没有找到就显示默认的图片
bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.album);
}
return bitmap;
}
}
运行的截图是:
我这里面就一首歌,这个示例最重要的是解决了另一个问题:取得音频文件的播放时间长度。