我遇到的问题是MediaMetadataRetriever总是为标题返回null,但仅限于库存S3。它在S3上与CyanogenMod合作,但与三星的股票没有合作。此外,在我的OnePlus上,一切正常。
守则非常简单:
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将在Samsung stock ROM上显示null,但在其他ROM上不显示。 这有点奇怪,这里有人有想法吗?如果没有,我会尝试使用第三方库来获取ID3标签。
答案 0 :(得分:0)
我在ICS上注意到了同样的问题(On 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)
始终返回null。
我认为除了使用外部库之外的解决方案是在文件路径上查询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扫描它(它应该有),信息应该在那里。这也适用于10级之前的API级别。
基本上,要做的是以下内容:如果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);
}
这是我迄今为止尝试解决这个问题的方法。但我无法保证它是否能为你效劳。
希望我帮助过。
编辑:您需要将路径或文件描述符作为参数传递给setDataSource。试试这段代码:
AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.music);
if (afd != null) {
MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
metaRetriever.setDataSource(afd.getFileDescriptor());
}