MediaMetadataRetriever在S3上返回null

时间:2015-04-06 22:31:21

标签: android

我遇到的问题是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标签。

1 个答案:

答案 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());
    }