gpt4 book ai didi

android - 如何仅使用其内容 Uri 强制更新文件的 MediaStore

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:12 25 4
gpt4 key购买 nike

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,这不是一个选项。

更新:

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

final ContentResolver resolver = context.getContentResolver();
resolver.refresh(uri, null, null);

最佳答案

我目前也在尝试重新设计我的应用程序以仅使用 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 在 sdcard 上,则必须先在 MediaStore 中搜索它,然后再更新它。

关于android - 如何仅使用其内容 Uri 强制更新文件的 MediaStore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55301206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com