我有一个奇怪的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
这是完整的日志:
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得出以下结论:他必须添加这些权限才能体现(我们将看到应用程序如何可能授予这些权限),但是他定义了这些权限(要知道有关定义权限的更多信息,请阅读: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 :
在上面我提到的系统 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