Permission Denial: startActivity pide ejecutar como usuario -2 pero está llamando desde el usuario 0; Esto requiere android.permission.INTERACT_ACROSS_USERS_FULL

Cuando estoy tratando de usar android 'am' comando para iniciar una actividad, está mal en la plataforma 4.2 (lo intenté, está bien en la versión 2.3). El código es así

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); } 

Y el error es así:

 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) 

quiero saber

1.¿Qué significa el usuario -2 y 0?

2.where puedo encontrar los detalles sobre estos ids?

3. ¿Qué debo hacer, sólo tiene que agregar los permisos? No quiero agregar los permisos que no sé nada sobre ellos.Puede que alguien me ayude, muy gracias!

1) En linux cada usuario tiene un número de identificación. 0 y -2 son ID de usuario (UID). 0 es root, -2 es un usuario al azar (que puede no ser una persona, puede ser una cuenta falsa usada por razones internas).

2) Cualquier libro en Linux. Android es sólo un marco gráfico en la parte superior de Linux.

3) Sí, sólo tiene que añadir el permiso.

El usuario 0 y el usuario -2 que está viendo son framework userIds, no Linux uids. Desde android.os.UserHandle , puede ver que userId 0 es el propietario del dispositivo, USER_OWNER (esto es totalmente diferente al Linux uid 0, que es root). userId -1 representa a todos los usuarios ( USER_ALL ), userId -2 representa el usuario actual ( USER_CURRENT ), userId -3 representa el usuario actual o self ( CURRENT_OR_SELF ) y userId -10000 representa el usuario nulo ( USER_NULL ).

En cuanto al permiso INTERACT_ACROSS_USERS_FULL , puede declararlo en el archivo de manifiesto, pero solo se le concederá si su aplicación está en la imagen del sistema de Android o firmada con el mismo certificado que otra aplicación en la imagen del sistema que declara el permiso. En otras palabras, es una signature o signatureOrSystem permiso.

Como @juanmf mencionado en un comentario, la adición de la opción --user 0 al comando resolvió el problema para mí. El comando resultante se vería así:

 am start --user 0 -a android.intent.action.VIEW -n com.android.browser/com.android.browser.BrowserActivity 

Los permisos son sólo una línea de código que debe agregar en el manifiesto para informarle que accede a esos recursos y solicita que android permita que estos recursos se utilicen. Introduzca aquí la descripción de la imagen

1) Acabo de agregar un ejemplo que contiene el permiso.

2) En Linux hay usuario root, grupo y otros. 0 viene a raíz y UID no puede ser negativo su valor está entre 0 – 999. Ver este enlace

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.