在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,该方法根本不会刷新。
由于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);