Android находит файлы на SDCard

Я работаю над приложением MP3, в котором я хотел бы индексировать файлы на своей SDCard. Как лучше всего это сделать?

Моя идея. Ищите файлы при первом запуске приложения и регистрируйте широковещательный приемник для намерений изменения состояния SDCard и ищите файлы всякий раз, когда намерение передается в широковещательном режиме.

Но в этом случае ANR появится, если мой широковещательный приемник не вернется в течение 10 секунд.

Ищем лучшие и безотказные идеи. Спасибо.


person Ragunath Jawahar    schedule 06.12.2010    source источник


Ответы (2)


Согласитесь с Крисом, 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.

person Darrell    schedule 06.12.2010

Чтобы избежать ANR, вам нужно выполнить поиск вне потока пользовательского интерфейса. Поскольку SD-карты могут быть большими, вы, вероятно, захотите сделать это в службе, а не в своей активности переднего плана, чтобы пользователь мог использовать свое устройство для других целей, пока поиск продолжается.

Но Android уже находит и индексирует поддерживаемые медиафайлы, поэтому вам следует посмотреть, сможете ли вы использовать встроенный материал MediaScanner.

person Chris Stratton    schedule 06.12.2010
comment
Да, когда я делаю это в первый раз, я просканирую его с помощью AsyncTask, но позже, когда будет получено намерение, я сделаю это с помощью службы. - person Ragunath Jawahar; 06.12.2010
comment
Почему бы вам тоже не воспользоваться услугой в первый раз? - person Chris Stratton; 06.12.2010