Android: получить информацию о музыкальном файле из необработанной папки

Я пытаюсь получить информацию о музыкальном файле в моей необработанной папке. Мне нужно получить продолжительность, название, исполнителя и т. д. Я знаю, как получить эту информацию для музыкальных файлов, хранящихся во внешнем хранилище, но я не знаю, как это сделать для музыкальных файлов в исходной папке. Помощь и ссылки приветствуются!


person Daiwik Daarun    schedule 22.06.2014    source источник


Ответы (4)


После поиска и использования приведенных ниже примеров мне не удалось. Решение @Jignesh Shaw дало мне исключение IllegalArgumentException, когда я установил источник MediaMetadataRetriever, а решение @Hanz Kratz смогло извлечь только продолжительность песни (как он описал)

Между тем, между двумя, однако, я был вдохновлен, чтобы придумать рабочее решение.

Uri mediaPath = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.song_name);
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(this, mediaPath);

Затем информация может быть извлечена так, как заявили оба пользователя.

String sponsorTitle = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
String sponsorArtist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
//and so on...

Я понятия не имею, почему это работает отлично, но решение @Hanz Kratz не работает. Если другие люди наткнутся на эту тему, было бы неплохо, если бы вы опубликовали свои выводы. Спасибо всем!

person Daiwik Daarun    schedule 27.06.2014

Просто получите FileDescriptor для необработанного ресурса, а затем используйте MediaMetadataRetriever для извлечения метаданных, таких как продолжительность и т. д.

    MediaMetadataRetriever mmr = new MediaMetadataRetriever();
    FileDescriptor fd = getResources().openRawResourceFd(R.raw.rocknroll).getFileDescriptor();
    mmr.setDataSource(fd);
    String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);

Это отлично работает для продолжительности, но, к сожалению, у MediaMetadataRetriever есть проблемы с исполнителем, названием,... с некоторыми файлами MP3: Android MediaMetadataRetriever возвращает нулевые значения для большинства ключей

person HHK    schedule 25.06.2014
comment
Спасибо за помощь. Вы подтолкнули меня в правильном направлении (правильный ответ см. в моем редактировании) - person Daiwik Daarun; 27.06.2014
comment
Здорово! Однако вы должны извлечь свой ответ из своего вопроса, опубликовать его как ответ и принять его. Совершенно нормально отвечать на вопросы по SO и принимать их. - person HHK; 27.06.2014

это может помочь: -

String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
 String[] projection = { MediaStore.Audio.Media._ID,
         MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.TITLE,
         MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.DISPLAY_NAME,
         MediaStore.Audio.Media.DURATION};

 cursor = this.managedQuery(
         MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection,null, null);

 private List<String> songs = new ArrayList<String>();

 while(cursor.moveToNext()){
     songs.add(cursor.getString(0) + "||" + cursor.getString(1) + "||" +
             cursor.getString(2) + "||" + cursor.getString(3) + "||" +
             cursor.getString(4) + "||" + cursor.getString(5));
 }
person Akshay Sharma    schedule 24.06.2014
comment
Спасибо за попытку, но это не то, что я ищу. Как указано в вопросе, я уже знаю, как извлекать информацию из файлов, расположенных во внешнем хранилище. Я пытаюсь получить информацию о файле в необработанной папке - person Daiwik Daarun; 25.06.2014

Загрузите путь к вашему ресурсу следующим образом:

String mediaPath = Uri.parse("android.resource://<your-package-name>/raw/filename").getPath();

Убедитесь, что вы не добавляете расширение файла. Например, используйте «имя файла», а не «имя файла.mp3».

Затем вы можете получить доступ к тегам ID3 (при условии, что вы используете файлы mp3) следующим образом:

MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(mediaPath);

String albumName = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);

и так далее..

Надеюсь это поможет!

person Jignesh Shah    schedule 26.06.2014
comment
Спасибо за помощь, ваш ответ подтолкнул меня в правильном направлении (см. редактирование для правильного ответа) - person Daiwik Daarun; 27.06.2014