0

我正在尝试确定如何访问存在于另一个配置文件中的 ContentProvider。

我在托管配置文件中有一个应用程序/服务,它实现了内容提供程序。我在主要配置文件中有第二个应用程序/服务,我希望它能够访问托管应用程序的内容提供程序。即交叉配置文件

现在我正在使用 android-testdpc 的修改版本对实现进行原型设计。我已将 ContentProvider 添加到 testdpc 源。我希望能够从在主配置文件中运行的另一个应用程序访问托管配置文件中的这个 ContentProvider。

我知道使用DevicePolicyManager.AddCrossProfileIntentFilter()I 可以允许在托管配置文件中发送的意图也可以在父级中解析,反之亦然。该文档指出仅支持活动意图。使用AddCrossProfileIntentFilter()我已经成功地能够通过使用意图和startActivity(). 但是,使用活动不是我想要做的,因为在 Q 和以后我无法从后台应用程序/服务启动活动。

如果两个应用程序存在于同一个配置文件中,我访问 ContentProvider 没有问题,但我无法确定如何跨配置文件工作。

4

1 回答 1

0

我终于得到了这个工作。

为此,我需要使用内容提供者中的活动来授予其他应用程序的权限。非内容提供者应用程序必须使用 startActivityForResult() 向内容提供者应用程序中的活动发送意图,请求访问内容提供者的权限。

此活动返回一个意图,使用 Intent.setData() 设置内容提供者 URI,并使用 Intent.setFlags() 设置权限。在我的例子中,我包含了 Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION 以使权限持久化。非内容提供者应用在 onActivityResult() 中获取结果意图,从结果中获取 URI,然后调用 ContentResolver.takePersistableUriPermission()。

为了使这项工作跨配置文件,我使用了 DevicePolicyManager.addCrossProfileIntentFilter() 来允许权限请求意图跨配置文件。在交叉配置文件时,我注意到结果意图中返回的内容提供者 URI 包括用户 ID。即“content://10@com.example.myprovider/test”。使用此 URI 进行查询将跨越配置文件。

这有助于https://www.futurelearn.com/courses/secure-android-app-development/0/steps/21592

于 2020-01-14T10:54:29.810 回答