MediaStore.Audio пустой курсор при попытке взять информацию об аудиофайле

Я начинающий разработчик. Столкнулся с такой проблемой при работе с Uri на targetSdk 22. Необходимо взять несколько данных об аудиофайле по uri (исполнитель, артист, автор альбома и т. п.) Делаю вот такой запрос:

String[] projection = new String[]{MediaStore.Audio.Media.AUTHOR,MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.ALBUM_ARTIST};
    
 Cursor cursor=context.getContentResolver().query(uri,projection,null,null);

if(cursor.moveToFirst()){...}

В итоге cursor у меня пустой и из-за этого вылетает исключение. Я посмотрел, ошибка связана с тем, что uri у меня не в формате content:// Подскажите, как привести uri в нужный формат, чтобы cursor заработал или какой-то другой путь взятия данных аудиофайла. Спасибо!


Ответы (1 шт):

Автор решения: justshurik

В общем, решение я нашел. Есть оказывается замечательный класс MediaMetadataRetriever, который не чувствителен к формату uri, который передается, в отличие от Cursor.

Вот такой код сработал нормально. Получилось очень компактно, особенно после удаления целой плеяды функций, который работали с Cursor для нахождения тех или иных параметров аудио-файла.

MediaMetadataRetriever metaRetriver = new MediaMetadataRetriever();
metaRetriver.setDataSource(context,uri);

String sArtist=null, sNameAudio=null;
sArtist=metaRetriver.extractMetadata(MediaMetadataRetriever.METADATA_KEY_AUTHOR);
if(sArtist==null) sArtist=context.getResources().getString(R.string.none);

sNameAudio=metaRetriver.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);

Надеюсь кому-нибудь будет полезен такой вариант ответа.

→ Ссылка