权限拒绝:startActivity 要求以用户 -2 的身份运行,但从用户 0 调用;这需要 android.permission.INTERACT_ACROSS_USERS_FULL
Posted
技术标签:
【中文标题】权限拒绝:startActivity 要求以用户 -2 的身份运行,但从用户 0 调用;这需要 android.permission.INTERACT_ACROSS_USERS_FULL【英文标题】:Permission Denial: startActivity asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL 【发布时间】:2013-08-12 03:28:00 【问题描述】:当我尝试使用android'am'命令启动一个activity时,在4.2平台下出错(我试过,在2.3版本下没问题)。代码是这样的
out = process.getOutputStream();
out.write(("am start -a android.intent.action.VIEW -n com.android.browser/com.android.browser.BrowserActivity\n").getBytes());
out.flush();
InputStream in = process.getInputStream();
BufferedReader re = new BufferedReader(new InputStreamReader(in));
String line = null;
while((line = re.readLine()) != null)
Log.d("conio","[result]"+line);
错误是这样的:
java.lang.SecurityException: Permission Denial: startActivity asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
at android.os.Parcel.readException(Parcel.java:1425)
at android.os.Parcel.readException(Parcel.java:1379)
at android.app.ActivityManagerProxy.startActivityAsUser(ActivityManagerNative.java:1921)
at com.android.commands.am.Am.runStart(Am.java:494)
at com.android.commands.am.Am.run(Am.java:109)
at com.android.commands.am.Am.main(Am.java:82)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:235)
at dalvik.system.NativeStart.main(Native Method)
我想知道
1.用户-2和0是什么意思?
2.在哪里可以找到有关这些 ID 的详细信息?
3.我应该怎么做,只是添加权限?我不想添加我对它们一无所知的权限。谁能帮助我,非常感谢!
【问题讨论】:
您究竟做了什么来解决这个错误?我的意思是你是如何明确地将用户句柄传递给“am”的? (code.google.com/p/android/issues/detail?id=39801) 能否请您不接受错误接受的答案。 我通过在am start
命令中添加选项--user '0'
解决了这个问题
那么,生产环境呢?我的意思是,您不能从最终用户设备上的命令启动您的应用程序。对?我在使用 Volley 时遇到了同样愚蠢的恼人错误,我不知道如何解决。
【参考方案1】:
您看到的用户 0 和用户 -2 是 framework userIds,而不是 Linux uids。从android.os.UserHandle 可以看出userId
0 是设备所有者USER_OWNER
(这与Linux 的uid
0 是root 完全不同)。 userId
-1 代表所有用户(USER_ALL
),userId
-2 代表当前用户(USER_CURRENT
),userId
-3 代表当前用户或自己(CURRENT_OR_SELF
),userId
-10000 代表空用户 (USER_NULL
)。
至于INTERACT_ACROSS_USERS_FULL
的权限,你可以在你的manifest文件中声明它,但只有当你的应用在Android系统镜像中或者与系统镜像中的另一个应用程序使用相同的证书签名时,你才会被授予声明许可。换句话说,它是signature
或signatureOrSystem
权限。
【讨论】:
在 /system/app 目录中对我不起作用 其实,我其实并不需要这个权限。在 /system/priv-app 目录中对我有用【参考方案2】:正如@juanmf 在评论中提到的,在命令中添加--user 0
选项为我解决了这个问题。生成的命令如下所示:
am start --user 0 -a android.intent.action.VIEW -n com.android.browser/com.android.browser.BrowserActivity
【讨论】:
【参考方案3】:在我的三星 Galaxy Tab Active 2 平板电脑升级到 Android 9 后,我收到了这个错误。经过大量搜索,我发现这个 post 建议关闭开发人员选项,重新启动平板电脑,然后重新打开开发人员选项。我最终只是关闭了 USB 调试,重新启动,然后重新打开 USB 调试,之后一切正常。
【讨论】:
【参考方案4】:权限只是您需要添加到清单中的一行代码,用于通知您访问这些资源并请求 android 允许使用这些资源。
1) 我刚刚添加了一个包含权限的示例。
2) 在 Linux 中有 root 用户、组和其他用户。 0 表示 root 并且 UID 不能为负,它的值在 0 - 999 之间。请参阅link
【讨论】:
谢谢,我现在知道权限声明了。我添加了权限,它也导致了异常,我在ActivityManagerServcie中查看了源代码,我发现它可能是需要这个权限的root uid . sudo ./adb kill-server sudo ./adb start-server 然后试试 ./adb devices 我知道你说的,但我的问题不同。这是4.2多用户的问题。我检查它可能是没有 INTERACT_ACROSS_USERS_FULL 权限的系统。我在这里也发现了一个类似的问题:code.google.com/p/android/issues/detail?id=39801【参考方案5】:1)在linux中,每个用户都有一个id号。 0 和 -2 是用户 ID (UID)。 0 是 root,-2 是某个随机用户(可能不是人,可能只是出于内部原因使用的假帐户)。
2) 任何关于 Linux 的书籍。 Android 只是 Linux 之上的一个图形框架。
3)是的,只需添加权限即可。
【讨论】:
感谢您的回答,但我也想知道为什么这个用户是 root。我使用此代码生成进程:'p = Runtime.getRuntime().exec("sh");' ,这个进程不应该是root,所以我认为问题可能来自'am'命令,它使root进程启动。对吗? 我添加了权限,它也有那个SecurityException。我检查了android 4.2源代码(ActivityManagerService.java中的方法'handleIncomingUser'),源代码检查callingUid的权限,而不是应用程序的uid权限。所以这个问题不能解决? 嗯,虽然被接受和赞成,但我可以自信地说,这个答案在所有 3 点上都是错误的。 1) -2 是一个框架userId
,指的是当前用户,而不是一个随机的Linuxuid
。 2) Android 不仅仅是 Linux 之上的 GUI。虽然 Linux 书可能有点帮助,但还有很多其他差异,您几乎无法从中理解 Android。 3) 继续并将INTERACT_ACROSS_USERS_FULL
添加到您的清单中。除非您的 APK 使用平台密钥签名或者是系统映像的一部分,否则它将被忽略。有关更多详细信息,请参阅下面的答案。
添加 INTERACT_ACROSS_USERS_FULL 无效。以上是关于权限拒绝:startActivity 要求以用户 -2 的身份运行,但从用户 0 调用;这需要 android.permission.INTERACT_ACROSS_USERS_FULL的主要内容,如果未能解决你的问题,请参考以下文章