這幾天在做一個音樂播放器,需要讀取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");
- }
-
- }