【问题标题】:MediaMetadataRetriever returns null on S3MediaMetadataRetriever 在 S3 上返回 null
【发布时间】:2015-06-11 09:50:58
【问题描述】:

我的问题是 MediaMetadataRetriever 总是为标题返回 null,但仅限于 S3 库存。它与 S3 上的 CyanogenMod 一起使用,但不适用于三星的股票 rom。此外,在我的 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 将在三星库存 ROM 上显示 null,但在其他 ROM 上不会。 这有点奇怪,这里有人有想法吗?如果没有,我会尝试 ID3 标签的第三方库。

【问题讨论】:

    标签: android


    【解决方案1】:

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

    除了使用外部库之外,我想到的一个解决方案是在文件路径上查询 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版本

    你也可以试试这个

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

    【讨论】:

    • 感谢您的回答!其实Android版本是4.4.2,所以应该不是API版本的问题,但是我把文件转换成另一种格式后再试一次(我只需要我raw文件夹中的文件)。如果以后有效果我会报告的。
    • @Zazama ,我真的很想知道它是否适合你。
    • 我意识到将文件转换为另一种格式,它会删除我的 ID3 标签:/ 所以我查看了你的其他解决方案,但并没有真正做到这一点(我是 android 开发的初学者)。 “mmr.setDataSource(audio.url, new HashMap());”。我不让这个工作。 Android 工作室说“audio.url”必须是一个字符串,我试图让它与 uri.toString() 一起工作,但它不起作用。你知道我怎样才能让它与我上面的 uri 一起工作吗?
    • 好吧,问题在于它是硬编码的 (R.raw.music)。一开始我不知道原始文件夹中有哪些文件,所以我把所有文件都放在一个数组中:“final Field[] fields = R.raw.class.getFields();”。这就是为什么我使用带有 uri 的字符串。你知道我不需要硬核的解决方案吗? :/ 如果惹恼了你,我很抱歉 x)
    • 好的,我已经可以使用了,我需要等我的朋友测试它,我检查后报告!现在,感谢您提供的所有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2016-01-26
    • 2021-11-21
    • 2015-08-11
    • 2013-08-16
    相关资源
    最近更新 更多