我在 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) 总是返回 null。
路径是正确的,并且 mp3 文件确实有 ID3 标记以及标题和所有内容。
除了使用外部库之外,我想到的一个解决方案是在文件路径上查询 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。