权限拒绝:startActivity要求以用户-2身份运行,但是从用户0调用; 这需要android.permission.INTERACT_ACROSS_USERS_FULL

pan*_*ang 16 android

当我尝试使用android'am'命令启动一个活动时,它在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);
}
Run Code Online (Sandbox Code Playgroud)

而错误是这样的:

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)                                                                                                                            
Run Code Online (Sandbox Code Playgroud)

我想知道

1.用户-2和0是什么意思?

2.我可以在哪里找到有关这些ID的详细信息?

3.我该怎么办,只需添加权限?我不想添加我对他们一无所知的权限.任何人都可以帮助我,非常感谢!

Pau*_*zzi 13

您看到的用户0和用户-2是框架 userIds,而不是Linux uids.从android.os.UserHandle中,您可以看到userId0是设备所有者USER_OWNER(这与Linux uid0 完全不同,它是root用户). userId-1表示所有用户(USER_ALL),- userId2表示当前用户(USER_CURRENT),userId-3表示当前用户或self(CURRENT_OR_SELF),- userId10000表示空用户(USER_NULL).

就权限而言INTERACT_ACROSS_USERS_FULL,您可以在清单文件中声明它,但只有当您的应用程序位于Android系统映像中或使用与声明权限的系统映像中的另一个应用程序相同的证书进行签名时,才会授予它.换句话说,它是一个signaturesignatureOrSystem许可.

  • 实际上,所以我毕竟不需要这个许可.在/ system/priv-app目录中为我工作 (2认同)

The*_*eIT 5

正如@juanmf在评论中提到的那样,--user 0在命令中添加选项可以解决我的问题.生成的命令如下所示:

am start --user 0 -a android.intent.action.VIEW -n com.android.browser/com.android.browser.BrowserActivity
Run Code Online (Sandbox Code Playgroud)


Gab*_*han -14

1)在linux中每个用户都有一个id号。0 和-2 是用户ID (UID)。0是root,-2是一些随机用户(可能不是一个人,它可能只是出于内部原因使用的假帐户)。

2)任何关于Linux的书。Android 只是 Linux 之上的一个图形框架。

3)是的,只需添加权限即可。

  • 嗯,虽然被接受并投票了,但我可以自信地说这个答案在所有 3 点上都是错误的。1) -2 是一个框架 `userId` ,指的是当前用户,而不是随机的 Linux `uid`。2) Android 不仅仅是 Linux 之上的 GUI。虽然 Linux 书籍可能有一点帮助,但还有很多其他差​​异,您很难从中理解 Android。3) 继续将“INTERACT_ACROSS_USERS_FULL”添加到您的清单中。除非您的 APK 使用平台密钥进行签名或者是系统映像的一部分,否则它将被忽略。有关更多详细信息,请参阅下面我的回答。 (17认同)