Программирование 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 является доступ к медиа-файлам путем запроса встроенной базы данных мультимедиа вместо работы непосредственно с файловой системой. Если вы хотите работать с базой данных СМИ обычно так:
- получение экземпляра распознавателя содержимого (обычно выполняется путем вызова
getContentResolver()
в вашей деятельности) - вы тогда можете спросите 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/