自更新到Ice Cream Sandwich以来,MediaMetadataRetriever大多停止工作

时间:2012-04-27 19:29:11

标签: android android-4.0-ice-cream-sandwich multimedia

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

我目前处于亏损状态,因为Android 4.0.3仿真器没有出现同样的问题,这个问题变得更糟。

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

如果您想检查我的应用程序是否在您的手机上出现此问题,您可以在http://www.sourceforge.net/projects/andrstoryteller

获取代码或APK

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

路径正确,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。

答案 2 :(得分:1)

有关情况的一点点更新。 我刚把几个Ogg / Vorbis文件放到我的手机上,它可以正确读取标签。 将不得不测试更多的文件,但也许这只是停止工作的MP3文件。 如果我能让更多的人用ICS手机测试这个,那会很酷。 无论如何,我目前正在研究另一种获取此信息的方法,因此我可能不会长时间使用MediaMetadataRetriever。