Я заметил ту же проблему на ICS (на Galaxy SII и Galaxy Tab II, работающие под управлением ICS 4.0.3). Кажется, это влияет только на mp3.
Я предполагаю, что одним из решений будет использование внешней библиотеки, но я также предпочитаю использовать то, что предлагает android, а не внешние библиотеки.
Я попробовал два решения:
MediaMetadataRetriever mmdr = new MediaMetadataRetriever();
mmdr.setDataSource(path);
String title = mmdr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
И
File file = new File(path);
FileInputStream inputStream;
inputStream = new FileInputStream(file);
mmdr = new MediaMetadataRetriever();
mmdr.setDataSource(inputStream.getFD());
inputStream.close();
String title = mmdr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
Но проблема остается: MediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)
всегда Retuns нуль.
Решение, которое я думал, помимо использования внешних библиотек будет запрашивать Mediastore на пути файла:
Cursor c = mContext.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] {MediaStore.MediaColumns.TITLE},
MediaStore.MediaColumns.DATA + "=?",
new String[] { path }, null);
String title;
if(c!=null && c.moveToFirst())
title = c.getString(c.getColumnIndex(MediaStore.MediaColumns.TITLE))
}
Если MediaScanner отсканировал (она должна иметь), информация должна быть там , Это также должно работать для уровней API до 10.
В принципе, что делать: Если версия SDK < 10 или расширение файла - это mp3 и SDK версии 15, я запрашиваю MediaStore, в противном случае я использую MediaMetaDataRetriever ,
Также вы можете попробовать это
if (Build.VERSION.SDK_INT >= 14) {
mmr = new MediaMetadataRetriever();
mmr.setDataSource(audio.url, new HashMap<String, String>());
} else {
mmr = new MediaMetadataRetriever();
mmr.setDataSource(audio.url);
}
Это то, что я пытался до сих пор, чтобы решить эту проблему. Но я не могу гарантировать, будет ли это работать для вас.
Надеюсь, я помог.
EDIT: Вам необходимо передать путь или файловый дескриптор в качестве аргумента для setDataSource. Попробуйте этот код:
AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.music);
if (afd != null) {
MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
metaRetriever.setDataSource(afd.getFileDescriptor());
}
Благодарим за этот ответ! На самом деле, версия для Android - 4.4.2, поэтому это не проблема с версией API, но я попробую еще раз после преобразования файлов в другой формат (мне это нужно только для файлов в моей исходной папке). Я сообщу, если это сработает позже. – Zazama
@ Zazama, мне очень интересно узнать, будет ли это работать для вас. – MCHAppy
Я понял, что конвертируя файлы в другой формат, он будет стирать мои теги ID3:/Так что я посмотрел на другое решение, но на самом деле не получил до сих пор (я новичок в разработке Android). "mmr.setDataSource (audio.url, новый HashMap());". Я не понимаю, как это работает. Студия Android говорит, что «audio.url» должна быть строкой, и я попытался заставить ее работать с uri.toString(), но она не работает. У вас есть идея, как я могу заставить это работать с uri, который у меня есть сверху? –
Zazama