這幾天在做一個音樂播放器,需要讀取SD卡上的所有音樂文件。
我的想法是遍歷所有SD卡上的所有文件目錄,把所有的.mp3 等音樂格式的文件全部讀取出來,在顯示在listview上。
這個做法是最容易想到的,也是可行的。
缺點是顯而易見的,就是效率低,占用瞭大量的資源。
後來在飛哥的指導下,才知道android系統中默認有個數據庫,來保存所有的音樂格式的文件。在系統的位置:
這個數據庫建的很詳細,基本上想要的信息都能找到。
之後直接使用這個數據的數據就行瞭。
例如:
/**
* 顯示音樂列表
*/
private void showListView()
{
String[] projection =
{ MediaStore.Audio.AudioColumns._ID,
MediaStore.Audio.AudioColumns.ARTIST,
MediaStore.Audio.AudioColumns.TITLE,
MediaStore.Audio.AudioColumns.DURATION };
Cursor c = getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, null,
null, null);
musicList = new int[c.getCount()];
int index = 0;
while (c.moveToNext())
{
musicList[index] = c.getInt(0);
index++;
}
startManagingCursor(c);
String[] from =
{ MediaStore.Audio.AudioColumns.TITLE,
MediaStore.Audio.AudioColumns.ARTIST,
MediaStore.Audio.AudioColumns.DURATION };
int[] to =
{ R.id.tv_musicname, R.id.tv_singer, R.id.tv_musictime };
MusicListAdapter adapter = new MusicListAdapter(this,
R.layout.musiclist_item, c, from, to);
mListView.setAdapter(adapter);
}
順便把直接讀取CD卡上mp3文件的方法寫出來,實現瞭一個接口:
package com.ll28;
import java.io.File;
import java.io.FilenameFilter;
public class MusicFilter implements FilenameFilter
{
@Override
public boolean accept(File dir, String filename)
{
return filename.endsWith(".mp3");
}
}
摘自:The way to All Blue!