gpt4 book ai didi

java - Android 权限。INTERACT_ACROSS_USERS 拒绝

转载 作者:IT老高 更新时间:2023-10-28 23:16:32 31 4
gpt4 key购买 nike

我有一个奇怪的 android 权限拒绝,是这样的:

java.lang.SecurityException: Permission Denial: isUserRunning() from pid=1078, uid=10284 requires android.permission.INTERACT_ACROSS_USERS

我没有找到任何关于 android.permission.INTERACT_ACROSS_USERS 的信息,只有 android.permission.INTERACT_ACROSS_USERS_FULL

这是完整的 logcat:

java.lang.SecurityException: Permission Denial: isUserRunning() from pid=25403, uid=10310 requires android.permission.INTERACT_ACROSS_USERS
at android.os.Parcel.readException(Parcel.java:1693)
at android.os.Parcel.readException(Parcel.java:1646)
at android.app.ActivityManagerProxy.isUserRunning(ActivityManagerNative.java:7000)
at android.os.UserManager.isUserUnlocked(UserManager.java:1069)
at android.os.UserManager.isUserUnlocked(UserManager.java:1063)
at com.android.launcher3.compat.UserManagerCompatVN.isUserUnlocked(UserManagerCompatVN.java:39)
at com.android.launcher3.LauncherModel$LoaderTask.loadWorkspace(LauncherModel.java:1759)
at com.android.launcher3.LauncherModel$LoaderTask.loadAndBindWorkspace(LauncherModel.java:1387)
at com.android.launcher3.LauncherModel$LoaderTask.run(LauncherModel.java:1486)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.os.HandlerThread.run(HandlerThread.java:61)

我已将此添加到我的 list 中:

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

最佳答案

TL;DR;此堆栈跟踪不属于您的应用程序,或者您需要您没有的权限。要了解这些权限,请阅读其余部分。

虽然 Michele 可能已经找到了答案,但我还是决定回答这个问题,因为它可能对其他人有用。提到的权限是签名|系统级权限。要了解有关不同类型权限的更多信息,请阅读以下内容:Permissions overview

基本上需要这些权限才能使用多用户 API,例如:

Context.startActivityAsUser(Intent, UserHandle)
Context.bindServiceAsUser(Intent, …, UserHandle)
Context.sendBroadcastAsUser(Intent, … , UserHandle)
Context.startServiceAsUser(Intent, …, UserHandle)

要了解更多信息,请阅读:Supporting Multiple Users这个:Building Multiuser-Aware Apps

由于该错误,Michele 得出了这样一个结论,即他必须将这些权限添加到 list 中(我们将看到应用程序如何获得这些权限),但相反,他已经定义了这些权限(要了解有关定义权限的更多信息,请阅读:Define a Custom App Permission):

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

我认为您最终会看到运行时错误,因为您无法定义这些权限,因为它们与已定义的两个系统权限具有相同的名称。想确定吗?看看真实系统 list 的一部分:

<!-- @SystemApi @hide Allows an application to call APIs that allow it to do interactions
across the users on the device, using singleton services and
user-targeted broadcasts. This permission is not available to
third party applications. -->
<permission android:name="android.permission.INTERACT_ACROSS_USERS"
android:protectionLevel="signature|system|privileged" />

<!-- @hide Fuller form of {@link android.Manifest.permission#INTERACT_ACROSS_USERS}
that removes restrictions on where broadcasts can be sent and allows other
types of interactions. -->
<permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
android:protectionLevel="signature" />

你在这个android系统的 list 文件中看到,这些权限已经定义好了,要使用它们,我们应该使用标签。

现在让我们谈谈如何将这些权限授予您的应用程序。根据我的经验,OEM 定义系统 list 的方式是可以将这些权限授予

  1. 与系统具有相同签名的应用程序(实际上只有 OEM 开发的应用程序)

  2. 特权应用位于/system/priv-app 下。

在我上面提到的系统 list 中,第二个权限仅定义为签名,因此只有与系统具有相同签名的应用才能获得这些权限。

如果您在设备上具有写入权限(可能它应该是 root 的,我对此了解不多),您可以通过以下命令将您的 apk 复制到 priv-app 文件夹中:

adb push path-to-your-app/your-app.apk /system/priv-app

就这些了吗?还没有!

自 android 8.0 以来,在 priv-app 下授予应用程序权限存在一些复杂性,您可以在此处阅读:Privileged Permission Whitelisting

关于java - Android 权限。INTERACT_ACROSS_USERS 拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43556869/

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