在 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);
答案 0 :(得分:1)
我目前也在尝试重新设计应用程序,使其仅使用URI,而不是使用所有hacky解决方案将其转换为文件路径(例如根据uri权限猜测路径等)。以前,我使用了{{ 1}},它没有任何缺陷,但是您可能已经尝试过,它不适用于URI。
通过用我的新数据手动更新MediaStore URI,我找到了成功:
MediaScannerConnection.scanFile(...)
不过,似乎仍然没有提供重新扫描特定文件的方式,这似乎是一种疏忽。例如,如果此URI来自其他地方,例如通过SAF在sdcard上,则必须先在MediaStore中搜索它,然后再进行更新。