Android permission.INTERACT_ACROSS_USERS_FULL

Android permission.INTERACT_ACROSS_USERS_FULL

我在 android 中有一个大型应用程序。

应用程序有时会崩溃并出现不清楚的错误。我不知道发生这种情况的确切时间和原因。

java.lang.SecurityException: Permission Denial: get/set setting for user asks
to run as user -2 but is calling from user 0; this requires 
android.permission.INTERACT_ACROSS_USERS_FULL

有什么帮助吗?

java.lang.SecurityException: Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL

将此 android:protectionLevel="signature" 添加到您的清单中。

更多详情,您可以查看Permission-Element

喜欢:

<permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" android:protectionLevel="signature"/>

总结 this answer, and looking at the sources of UserHandle.java 我们看到了 框架 用户 ID 的含义。

# | @UserIdInt            | Value  | Status     | Description |
# | --------------------- | ------ | ---------- | ------------| 
# | USER_OWNER            | 0      | deprecated | "owner" user of the device
# | USER_SYSTEM           | 0      | ok         | "system" user of the device
# | USER_ALL              | -1     | ok         | ALL users on the device
  | USER_CURRENT          | -2     | ok         | the currently active user
# | USER_CURRENT_OR_SELF  | -3     | ok         | id from which we would like to send to the current user
# | USER_NULL             | -10000 | ok         | An undefined user id

然后要了解 android:protectionLevel="signature" 的含义,您必须阅读有关 permission-element 的页面。 table 中总结:

因此,您需要在 AndroidManifest.xml 中做什么很大程度上取决于您需要支持的 API,因为更高的 > 23 API 也需要 android:permissionGroup= definition,对于非正常("dangerous")权限...

也很高兴知道(来自@CommonsWare)

为了能够保持 INTERACT_ACROSS_USERS,您的应用必须通过固件的签名密钥签名它有安装在系统分区。

为了能够保持 INTERACT_ACROSS_USERS_FULL,您的应用必须由固件的签名密钥签名。

我在使用 billingProcessor.subscribe()billingProcessor.purchase() 时遇到了同样的问题参数为产品的Activity和product_id。我传递了 product_id 的值是空的

请确保您在 product_id 中传递的值不为空。

一种可能的解决方案是禁用 auto-fill,但它仅适用于 Android Oreo。检查这个

只需将此代码添加到您的应用中即可:

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        window.decorView.importantForAutofill = 
        View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS;
    }

并重命名 getUserId() 方法(如果有)。

我很幸运地解决了这个问题。我正在使用导致此问题的单例片段实例。当我用 new fragment() 替换 fragment.getInstance() 调用时,它就像一个魅力。片段不应该被用作单例,应该用保存的状态带回来(如果需要)。

这是一个非常奇怪的错误...我在从 Java 切换到 Kotlin 或可能从任何 Android Studio 更新后遇到了这个错误。我开始从 XML 和 .kt 文件中一个一个地评论元素,直到我发现该错误与任何 userId(在错误中提到)无关,也与任何 Retrofit 调用无关,错误是由 XML 中的一个 Spinner 元素引起,当我加载这些元素时,.kt 文件中没有任何内容,只是这样:

<Spinner
        android:id="@+id/number_people_sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text" />

所以我删除了它,一切又好了。我认为问题是由元素的某些间距引起的(因为该微调器位于选项卡式 Activity 中的片段中)并且我在长长的错误行中看到了有关间距和子度量的内容。

记住只是检查错误文件中任何可能的小东西,错误可能来自任何东西......

当我升级 android 设备的 OS 版本时,我遇到了同样的问题“android.permission.INTERACT_ACROSS_USERS_FULL”。我尝试清理并重建项目,问题已经解决。

在设备上更新 OS 后只需 运行 即可。

硬重启解决了。

我在将 phone OS 更新为 Android 后立即遇到此错误 9. 除了重置(重新启动)phone 和重新启动 Android Studio 之外什么都没有对我来说。