指定したフォルダーからすべての音楽ファイルをスキャンしようとしていますが、アプリを閉じるとパフォーマンスの問題が発生します。
私のアプローチは、最初に以下を使用して電話からすべての音楽ファイルを取得することです。
String[] projection = {
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.TITLE
};
String selection = MediaStore.Audio.Media.IS_MUSIC + "!=" + 0;
cursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
null,
MediaStore.Audio.Media.TITLE + " ASC");
次に、以下を使用して、フェッチされた各ファイルの場所を取得します。
columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
ファイルの場所が指定したフォルダ内にある場合は、画面に表示されるリストに追加します。
このアプローチの問題は、パフォーマンスが良くないことです。
4〜5秒間ハングします。
リストをスクロールすると、アプリが閉じます。
以下は私が今使っている完全なコードです:
private String[] getTrackList() {
String[] result = null;
String[] projection = {
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.TITLE
};
String selection = MediaStore.Audio.Media.IS_MUSIC + "!=" + 0;
cursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
null,
MediaStore.Audio.Media.TITLE + " ASC");
result = new String[cursor.getCount()];
int position = 0;
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
getSearchableDir("/mnt/sdcard/Music/"); //See below
columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
String currentDir = cursor.getString(columnIndex).substring(0,
cursor.getString(columnIndex).lastIndexOf("/") + 1);
if (searchableDir.contains(currentDir)) {
columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE);
result[position] = cursor.getString(columnIndex);
position++;
}
}
return result;
}
// Function for recursively fetching all the sub-directories
private void getSearchableDir(String path) {
searchableDir.add(path);
File root = new File(path);
File[] list = root.listFiles();
for (File f : list) {
if (f.isDirectory()) {
searchableDir.add(f.getAbsolutePath());
getSearchableDir(f.getAbsolutePath());
}
}
}