(Android 11) 如何允许应用访问另一个应用的 Android/data 文件夹中的文件?

问题描述

我有两个应用程序。一个应用程序 (P) 使用一个具有专有扩展名(比如 .XXX)的文件一个 .json 文件,其中包含 P 将如何处理另一个文件的说明。另一个应用程序 (Q) 创建这些文件和意图到 P,告诉 P .json 文件的路径,其中包含 .XXX 文件的路径。 P 然后读取 .json 文件(在 Q 的目录中),然后读取 .XXX 文件(再次,在 Q 的目录中)。 P 对 .XXX 文件做了很多事情,但我认为 P 不必写入。

在 Android 11 之前,所有文件都位于 root/MyAppDirectory_Q 中,并且可以轻松地在应用之间访问/共享文件。随着范围存储越来越流行,我需要将所有文件保存在 Android/data/com.companyName.MyApp_Q 目录中。

我如何从 Q 到 P 并授予 P 访问 Q 的 Android/data 文件夹中的两个文件的权限?我正在 Xamarin 中执行此操作,但一旦它工作,我最终将不得不在直接 Java 中重新创建 Q。

解决方法

一种方法是让 Q 使用 Intent 中的 URI(使用 ClipData)向 P 发送广播。 Q 将使用 FLAG_GRANT_PERSISTABLE_URI_PERMISSIONgrantUriPermission() 授予持久权限。 P 将接收带有 URI 的广播并使用 takePersistableUriPermission() 接受它们。之后,P 将能够使用提供的 URI 访问文件。 URI 可能来自 FileProvider,因此它们由 Q 的外部文件目录中的文件支持。