Я работаю над приложением MP3, в котором я хотел бы индексировать файлы на SDCard. Каков наилучший способ сделать это?
Моя идея. Поиск файлов, когда приложение запускается в первый раз, и зарегистрировать широковещательный приемник для изменения состояния SDCard и поиска файлов в любое время, когда намерение транслируется.
Но в этом случае ANR появится, если мой вещательный приемник не вернется в течение 10 секунд.
Ищем лучшие и безотказные идеи. Спасибо.
Согласитесь с Крисом, MediaScanner находит музыку для вас, заполняя базу данных MediaStore. Вот какой код для поиска музыки:
final Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
final String[] cursor_cols = {
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.TITLE,
};
final String where = MediaStore.Audio.Media.IS_MUSIC + "=1";
final Cursor cursor = getContentResolver().query(uri, cursor_cols, where, null, null);
cursor.moveToNext();
final String artist = cursor.getString(_cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
final String album = cursor.getString(_cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
final String track = cursor.getString(_cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
doSomethingInteresting(artist, album, track);
В поле "данные" содержится дескриптор, который вы можете использовать с MediaPlayer.
Чтобы избежать ANR, вам необходимо выполнить поиск вне потока пользовательского интерфейса. Поскольку SD-карты могут быть большими, вы, вероятно, захотите сделать это в службе, а не в своей деятельности переднего плана, чтобы пользователь мог использовать свое устройство для других вещей, пока поиск продолжается.
Но андроид уже находит и индексирует поддерживаемые медиафайлы, поэтому вы должны увидеть, можете ли вы использовать встроенный материал MediaScanner.