Программирование Android-создание URI для получения местоположения звука

Я новичок в Java, а также в программировании на android, поэтому все немного странно для меня! Я в основном исхожу из фона в C++ / C# так говорят технологии!

абы.

Я пытаюсь создать простой класс, который обрабатывает аудио для пользовательского музыкального проигрывателя, который я разрабатываю. У меня есть все события нажатия клавиш, поэтому теперь я работаю над функциональностью.

Я использую MediaPlayer класс для обработки большинства жестких вещей, но я немного смущен как получить доступ к аудио, которое сохраняется на мобильном устройстве пользователей.

Я провел небольшое исследование, и, по-видимому, устройство android имеет встроенную базу данных, которая управляет местоположениями всех аудио, и для доступа к этим данным я должен использовать Uri?

Если кто-то мог бы опубликовать некоторые примеры кода, как использовать Uri чтобы получить доступ к этому, я уверен, что смогу построить поверх этого, чтобы затем добавить данные в любой контейнер I жаждать.

просто чтобы прояснить-каталог местоположения музыки не известен пользователю, и я не делаю папку raw, я хочу получить доступ ко всей музыке, хранящейся на устройстве пользователей, где программное обеспечение может ее воспроизводить.

или, если это не удастся, хороший учебник... Я просмотрел документы, предоставленные google, но нет никаких примеров кодов, поэтому я действительно не знаю, с чего начать!

спасибо всем.

3 ответов


вот пример того, как использовать Uri для доступа к аудиофайлам, этот код ищет песни на устройстве пользователей и сохраняет детали в songsList.

ArrayList<HashMap<String, String>> songsList = new ArrayList<>();
String[] STAR = {"*"};

Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
Cursor cursor = managedQuery(uri, STAR, selection, null, null);

if (cursor != null) {
    if (cursor.moveToFirst()) {
        do {
            String songName = cursor.getString(cursor.
                    getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
            String path = cursor.getString(cursor
                    .getColumnIndex(MediaStore.Audio.Media.DATA));
            String albumName = cursor.getString(cursor
                    .getColumnIndex(MediaStore.Audio.Media.ALBUM));
            int albumId = cursor.getInt(cursor
                    .getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));

            HashMap<String, String> song = new HashMap<String, String>();
            song.put("songTitle", albumName + " " + songName + "___" + albumId);
            song.put("songPath", path);
            songsList.add(song);
        } while (cursor.moveToNext());
    }
}

вы, вероятно, будете использовать предоставленный MediaStore и запросить его для всех найденных аудио. Это ContentProvider, который поставляется с системой, и вы можете получить доступ к нему, используя свой собственный ContentResolver. Взгляните на MediaStore.Audio.Media и посмотрите на Uri записи есть. Также смотрите на этой странице, "извлечение носителя из ContentResolver" для некоторого простого примера кода.


сначала вы должны подумать о том, действительно ли вы хотите воспроизводить свои аудиофайлы непосредственно через файловую систему. Более распространенным способом работы на android является доступ к медиа-файлам путем запроса встроенной базы данных мультимедиа вместо работы непосредственно с файловой системой. Если вы хотите работать с базой данных СМИ обычно так:

  1. получение экземпляра распознавателя содержимого (обычно выполняется путем вызова getContentResolver() в вашей деятельности)
  2. вы тогда можете спросите ContentResolver для доступных носителей определенного типа. Здесь вы впервые вступаете в контакт с URI. Вы сообщаете ContentResolver, какой тип носителя вы интересуетесь, указав определенный URI для вашего запроса. Поскольку вы заинтересованы в музыке, вы запросите android.поставщик.Система хранения mediastore.Звуковой.Сми.EXTERNAL_CONTENT_URI.

теперь вы можете запросить ContentResolver следующим образом:

Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = contentResolver.query(uri, null, null, null, null);

это самый основной запрос, который предоставляет все зарегистрированные медиа-объекты. Указав другие (нулевые) параметры, можно задать критерии фильтрации,сортировки и т. д..

ваш запрос дает вам экземпляр Cursor. С вашим экземпляром курсора вы можете в основном сделать две вещи.

  • вы можете перебирать результаты вашего запроса
  • вы можете спросить его о структуре столбца ваших результатов (например, индекс заголовка столбца имени, имя исполнителя и последний, но не минимум столбец ID).

поэтому предположим, что вас интересует только идентификатор первой песни. Вы делаете это, установив Курсор в его начале, вызвав:

cursor.moveToFirst();

теперь вы можете просто вызвать типизированные геттеры курсора для доступа к столбцам, которые вас интересуют, так, например, для идентификатора этой песни вы бы вызвать:

long mySongId=cursor.getLong(cursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID));

если вы хотите знать название альбома, вы могли бы сделать:

cursor.getString(android.provider.MediaStore.Audio.Media.ALBUM);

очевидно, я опустил все обработка ошибок для краткости (в реальном примере вы должны проверить, есть ли какие-либо песни на вашем устройстве, что запрос удался,...).

теперь, так как у вас есть ваши песни ID в mySongId вы можете пойти на Ури вещь во второй раз. На этот раз вы можете создать полный URI для своей песни, позвонив:

Uri mySongUri=ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mySongsId);

это дает вам URI вашего медиа-файла, который вы можете затем дать mediaplayer, чтобы начать воспроизведение файла:

myMPlayer = new MediaPlayer();
myMPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
myMPlayer.setDataSource(getApplicationContext(), mySongUri);

будет обязательно иметь хорошую песню в качестве первой песни на вашем устройстве, чтобы вы могли слушать хорошую музыку после всей тяжелой работы: -)

кстати.: Если вы хотите узнать больше о концепциях ContentProvider и ContentResolver Android, вы можете проверить этот учебник: http://www.grokkingandroid.com/android-tutorial-content-provider-basics/