gpt4 book ai didi

android - 如何跨用户个人资料创建内容提供者?

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

对于基于 AOSP 源构建的嵌入式项目,我在一个(系统)应用程序中有大量数据,其他应用程序必须可以访问这些数据。是的,我知道:内容提供商或服务的典型工作,但是......相同的数据(那个大块的相同单个实例)必须可供设备上所有用户配置文件上的应用程序访问!

我已经发现 Android 为服务、内容提供者和接收者提供了一个 android:singleUser="true"属性,但它有一个烦人的副作用,它强制 android:exported="false"!因此,我假设一个解决方案可能是在我的 list 中有一个内容提供者使用 android:singleUser="true"和第二个是 android:exported="true"并且让第二个只查询第一个以获取实际数据另一个应用程序可能需要,但是......这看起来太丑陋了,在我的情况下 - 对于单用户 Android 已经存在具有内容提供者和服务的应用程序,它将需要进行相当多的更改。

我还尝试将我的完整(系统)应用程序标记为 android:persistent="true",但这导致访问/data/data 的某些部分时出现问题,其中有大量数据(我需要进一步调试以找到根本原因)。

所以,我的问题是:是否有任何简单/建议的方法来创建内容提供者(以及同一应用程序中的服务和接收者的相同问题),以便该应用程序真正充当跨多个用户的单例(而不是系统服务,因为我们不想通过将我们的东西作为 SystemServer 的一部分运行来影响系统稳定性)?

最佳答案

android:singleUser="true"android:exported="true" 一起使用是正确的方法,但使用此属性有一些注意事项。

首先,ActivityManagerService (isSingleton 方法) 将忽略此属性,除非您的应用具有 INTERACT_ACCROSS_USERS 权限。

第二(这就是我认为您的问题所在),您的应用还必须作为特权应用安装在 priv-app 文件夹中(Android.mk 中的“LOCAL_PRIVILEGED_MODULE := true” ).否则,PackageParser 将清除您的“android:exported”属性。

 if (sa.getBoolean(
com.android.internal.R.styleable.AndroidManifestProvider_singleUser,
false)) {
p.info.flags |= ProviderInfo.FLAG_SINGLE_USER;
if (p.info.exported && (flags & PARSE_IS_PRIVILEGED) == 0) {
Slog.w(TAG, "Provider exported request ignored due to singleUser: "
+ p.className + " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
p.info.exported = false;
}
}

注意:以上所有内容不仅适用于提供者,也适用于服务和接收者。


更新:似乎只在 Android 5.0 及更高版本中测试包是否为特权应用程序。早期版本只是删除了导出属性。

关于android - 如何跨用户个人资料创建内容提供者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20967227/

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