2015-04-06 3 views
1

У меня проблема с тем, что MediaMetadataRetriever всегда возвращает null для заголовка, но только на складе S3. Он работает с CyanogenMod на S3, но не с плеером Samsung. Кроме того, на моем OnePlus все работает нормально.MediaMetadataRetriever возвращает null на S3

Кодекс очень прост:

MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 
String titlename = fields[count].getName(); 
final Uri uri = Uri.parse("android.resource://" + getPackageName() + "/raw/" + titlename); 
mmr.setDataSource(MainActivity.this, uri); 
final String name = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); 

[...] 

tv.setText(name + " "); 

TextView покажет нуль на фондовом ROM Samsung, но не на других дисках. Это немного странно, у кого-то есть идея? Если нет, я попробую стороннюю библиотеку для тегов ID3.

ответ

0

Я заметил ту же проблему на 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()); 
    } 
+0

Благодарим за этот ответ! На самом деле, версия для Android - 4.4.2, поэтому это не проблема с версией API, но я попробую еще раз после преобразования файлов в другой формат (мне это нужно только для файлов в моей исходной папке). Я сообщу, если это сработает позже. – Zazama

+0

@ Zazama, мне очень интересно узнать, будет ли это работать для вас. – MCHAppy

+0

Я понял, что конвертируя файлы в другой формат, он будет стирать мои теги ID3:/Так что я посмотрел на другое решение, но на самом деле не получил до сих пор (я новичок в разработке Android). "mmr.setDataSource (audio.url, новый HashMap ());". Я не понимаю, как это работает. Студия Android говорит, что «audio.url» должна быть строкой, и я попытался заставить ее работать с uri.toString(), но она не работает. У вас есть идея, как я могу заставить это работать с uri, который у меня есть сверху? – Zazama

Смежные вопросы