如何仅使用Content Uri强制更新文件的MediaStore?

12
在Android Q中,字段MediaStore.Files.FileColumns.DATA已被弃用,并且当目标操作系统版本为此时,可能为Null或应用程序无权读取它,因此最好仅使用文件的内容Uri进行工作。
由于MediaScannerConnection仅接受文件路径,我发现对于Android Q,这不再是一个选项。
如何通过仅使用其Uri来强制单个文件的自动MediaStore更新/重新扫描?意图是不尝试找到真实路径,仅依赖于Uri。
请注意,强制更新的Uri是媒体内容Uri(而不是SAF Uri)。 例如:content://media/external/images/media/123
解决方案不能重新扫描整个存储或卸载/挂载存储,因为这将在我们的工作流程中产生很高的性能影响,并使其完全无法使用。
并且因为意图仅使用Uri,所以要避免强制扫描任何特定的文件目录,如果它包含大量文件,这也会产生影响,并且意味着必须从Uri解析出真实的目录路径,这是不可行的。
更新:
我们尝试使用Android O中引入的ContentResolver.refresh方法,但未能成功,特别是对于像content://media/external/images/media/123这样格式的媒体内容Uri,该方法根本不会刷新。
final ContentResolver resolver = context.getContentResolver();
resolver.refresh(uri, null, null);
1个回答

3

我目前也正在尝试重新设计我的应用程序,使用URI而不是所有的hacky解决方案来将它们转换为文件路径(例如根据uri权限猜测路径等)。以前,我使用MediaScannerConnection.scanFile(...),这个方法一直没有问题,但正如您可能已经尝试过的那样,它无法与URI一起使用。

我通过手动更新MediaStore URI来成功实现了我的新数据,像这样:

public void updateMediaStore(final Uri content, final String title) {
    final ContentValues values = new ContentValues();
    values.put(MediaStore.Audio.AudioColumns.TITLE, title);
    // ... the rest of your data
    cr.update(res, values, null, null);
}

然而,不提供重新扫描特定文件的方法似乎是一种疏忽。例如,如果此URI来自其他位置,例如通过SAF在SD卡上,则必须先在MediaStore中搜索它,然后才能更新它。


谢谢,这是我目前的解决方案。无论如何,我已经提出了一个功能请求,虽然它已经被传递给开发团队,但还没有得到答复。如果有更多的开发人员给它点赞,我们在Android Q中解决这个问题的机会就越大:https://issuetracker.google.com/issues/129089149 - PerracoLabs
1
我也是。如果MediaScannerConnection.scanFile()直接接受Uri,那就更好了。这将解决这个噩梦。 - Jaya Prakash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接