如何仅使用其内容Uri强制对文件进行MediaStore更新

Per*_*abs 5 android uri mediastore android-mediascanner

Android Q中不建议使用MediaStore.Files.FileColumns.DATA 字段,该字段可以为Null或应用程序在以此类OS版本为目标时无权读取它,因此最好仅使用文件内容Uri进行工作。

由于MediaScannerConnection仅接受文件路径,因此我发现对于Android Q,这不再是一个选择。

在不知道其真实路径且仅使用其Uri的情况下,如何强制MediaStore 自动更新/重新扫描单个文件的方法是什么?这样做的目的不是什至试图找到真正的道路,而只能依靠乌里。

考虑强制更新的Uri是媒体内容Uri (而不是SAF Uri)。
示例:content:// media / external / images / media / 123

解决方案一定不能是重新扫描整个存储或再次卸载/装入存储,因为这将在我们的工作流程中造成很高的性能损失,并将使其完全无法使用。

并且由于打算仅使用Uri,因此避免强行扫描文件的任何特定目录,如果其中包含大量文件,这也会产生影响,并暗示必须从Uri解析真实目录路径,这不是一个选择。

更新:

我们尝试 Android O中引入的ContentResolver.refresh方法,但结果没有成功,但是当涉及诸如以下内容的媒体内容Uri时,此方法根本不做任何刷新:content:// media / external / images / media / 123

final ContentResolver resolver = context.getContentResolver();
resolver.refresh(uri, null, null);
Run Code Online (Sandbox Code Playgroud)

Jos*_*iak 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);
}
Run Code Online (Sandbox Code Playgroud)

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