2

自从我将 Galaxy S2 升级到 Android 4 后,我的音频播放器应用程序出现了一些奇怪的问题。由于升级后 MediaMetadataRetriever 除了音轨号和嵌入的图片外,没有输出太多信息。没有标题,没有艺术家,几乎什么都没有。

我目前不知所措,因为 Android 4.0.3 模拟器没有同样的问题,问题变得更糟了。

谷歌搜索并没有多大帮助,尽管我很难想象我会是唯一一个遇到这种问题的人。我妻子的 SGS2 显示同样的问题,所以我不认为这是仅限于我的手机的一些奇怪问题。有谁知道这是否可能是仅限于 SGS2 的 ICS 的问题?还有其他人在 ICS 上遇到过 MediaMetadataRetriever 的问题吗?而且,我想最重要的是,有人对此有解决方案吗?

如果您想检查我的应用程序在您的手机上是否存在该问题,您可以在http://www.sourceforge.net/projects/andrstoryteller获取代码或 APK

任何关于我如何能够追查问题的一般性建议也会有所帮助。

4

3 回答 3

3

我将在有时间的时候测试您的示例应用程序,但与此同时,您可能还想考虑除 MediaMetadataRetriever 之外的另一种解决方案,因为它限制了您的 API 兼容性并且(显然)并不总是有效。我的项目ServeStream使用 Apache Tika 的精简版本来检索元数据。您可能想在自己的项目中考虑这种方法。这是 Tika jar 的 URL 和进行解析的类:

http://servestream.svn.sourceforge.net/viewvc/servestream/trunk/lib/tika-app-1.0.jar?view=log http://servestream.svn.sourceforge.net/viewvc/servestream/trunk/src /net/sourceforge/servestream/utils/MetadataRetriever.java?revision=1033&view=markup

于 2012-04-27T19:39:14.220 回答
3

我在 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。

于 2012-09-25T10:52:15.590 回答
1

稍微更新一下情况。我刚刚在手机上放了几个 Ogg/Vorbis 文件,它可以正确读取标签。将不得不使用更多文件进行测试,但也许这只停止了对 MP3 文件的工作。如果我能让更多的人使用 ICS 电话来测试这个,那就太酷了。无论如何,我目前正在寻找另一种获取此信息的方法,因此我可能不会再使用 MediaMetadataRetriever 了。

于 2012-05-04T15:43:58.473 回答