Android: java.lang.SecurityException: Permission Denial: start Intent

112

He creado una aplicación que contiene la actividad de GWVectraNotifier que se llama desde otras aplicaciones para mostrar la notificación.

En el cuadro de diálogo de Notificación, habrá un botón 'mostrar' y un botón 'cerrar'.

Al hacer clic en el botón 'mostrar', se iniciará la actividad correspondiente.

Para comprobar la funcionalidad de la aplicación anterior,

Inicié la actividad de GWVectraNotifier desde la aplicación K9Mail en el activador de eventos de checkmail.

Puedo iniciar la actividad de GWVectraNotifier con éxito, pero al hacer clic en el botón 'mostrar' tendré que iniciar la actividad 'MessageList' de K9mail.Para hacerlo, escribí el siguiente código:

Intent i = new Intent();
i.setComponent(new ComponentName("com.fsck.k9", "com.fsck.k9.activity.MessageList"));
i.putExtra("account", accUuid);
i.putExtra("folder", accFolder);
startActivity(i); 

que arroja:

WARN/ActivityManager(59): Permission denied: checkComponentPermission() reqUid=10050
WARN/ActivityManager(59): Permission Denial: starting Intent { cmp=com.fsck.k9/.activity.MessageList (has extras) } from ProcessRecord{43f6d7c8 675:com.i10n.notifier/10052} (pid=675, uid=10052) requires null
WARN/System.err(675): java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.fsck.k9/.activity.MessageList (has extras) } from ProcessRecord{43f6d7c8 675:com.i10n.notifier/10052} (pid=675, uid=10052) requires null
WARN/System.err(675):     at android.os.Parcel.readException(Parcel.java:1247)
WARN/System.err(675):     at android.os.Parcel.readException(Parcel.java:1235)
WARN/System.err(675):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1298)
WARN/System.err(675):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
WARN/System.err(675):     at android.app.Activity.startActivityForResult(Activity.java:2817)
WARN/System.err(675):     at android.app.Activity.startActivity(Activity.java:2923)
WARN/System.err(675):     at com.i10n.notifier.GWVectraNotifier$2$1.run(GWVectraNotifier.java:63)
WARN/System.err(675):     at android.app.Activity.runOnUiThread(Activity.java:3707)
WARN/System.err(675):     at com.i10n.notifier.GWVectraNotifier$2.onClick(GWVectraNotifier.java:53)
WARN/System.err(675):     at android.view.View.performClick(View.java:2408)
WARN/System.err(675):     at android.view.View$PerformClick.run(View.java:8816)
WARN/System.err(675):     at android.os.Handler.handleCallback(Handler.java:587)
WARN/System.err(675):     at android.os.Handler.dispatchMessage(Handler.java:92)
WARN/System.err(675):     at android.os.Looper.loop(Looper.java:123)
WARN/System.err(675):     at android.app.ActivityThread.main(ActivityThread.java:4627)
WARN/System.err(675):     at java.lang.reflect.Method.invokeNative(Native Method)
WARN/System.err(675):     at java.lang.reflect.Method.invoke(Method.java:521)
WARN/System.err(675):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
WARN/System.err(675):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
WARN/System.err(675):     at dalvik.system.NativeStart.main(Native Method)

En realidad, no puedo entender qué permisos incluir en el archivo de manifiesto de mi aplicación Notifier para acceder a MessageList de k9Mail. Estoy pegando a continuación los permisos incluidos en el archivo de manifiesto de la aplicación k9mail:

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.READ_OWNER_DATA"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="org.thialfihar.android.apg.permission.READ_KEY_DETAILS"/>
<permission android:name="com.fsck.k9.permission.READ_ATTACHMENT"
            android:permissionGroup="android.permission-group.MESSAGES"
            android:protectionLevel="dangerous"
            android:label="@string/read_attachment_label"
            android:description="@string/read_attachment_desc"/>
<uses-permission android:name="com.fsck.k9.permission.READ_ATTACHMENT"/>
<permission android:name="com.fsck.k9.permission.REMOTE_CONTROL"
             android:permissionGroup="android.permission-group.MESSAGES"
             android:protectionLevel="dangerous"
             android:label="@string/remote_control_label"
             android:description="@string/remote_control_desc"/>
<uses-permission android:name="com.fsck.k9.permission.REMOTE_CONTROL"/>
<permission android:name="com.fsck.k9.permission.READ_MESSAGES"
            android:permissionGroup="android.permission-group.MESSAGES"
            android:protectionLevel="normal"
            android:label="@string/read_messages_label"
            android:description="@string/read_messages_desc"/>
<uses-permission android:name="com.fsck.k9.permission.READ_MESSAGES"/>
<permission android:name="com.fsck.k9.permission.DELETE_MESSAGES"
            android:permissionGroup="android.permission-group.MESSAGES"
            android:protectionLevel="normal"
            android:label="@string/delete_messages_label"
            android:description="@string/read_messages_desc"/>
<uses-permission android:name="com.fsck.k9.permission.DELETE_MESSAGES"/>           

¿Alguien puede decirme qué permiso incluir en mi aplicación? En los permisos anteriores, algunos son solo para k9mail, porque esas son las clases de permisos escritas para k9. Por lo tanto, solo podré incluir los permisos integrados de Android en los permisos dados anteriormente. Intenté hacerlo también, pero no resolvió mi problema :(

Swathi EP
fuente
Resolví esto agregando el siguiente filtro de intención en el archivo de manifiesto bajo la etiqueta de actividad MessageList en AndroidManifest.xml: <intent-filter> <action android: name = "android.intent.action.MAIN" /> </ intent-filter >
Swathi EP
He agregado <intent-filter> <action android: name = "android.intent.action.MAIN" /> </intent-filter> y android: exported = "true" pero aún obtengo java.lang.security excepción? ¿Pueden ayudarme a resolver esto?
Charan Pai

Respuestas:

155

Debe agregar android:exported="true"el archivo de manifiesto en la actividad que está intentando iniciar.

Desde Android: documentación exportada :

android: exported
Si la actividad puede ser iniciada o no por componentes de otras aplicaciones: "verdadero" si puede ser, y "falso" si no. Si es "falso", la actividad solo puede ser iniciada por componentes de la misma aplicación o aplicaciones con el mismo ID de usuario.

El valor predeterminado depende de si la actividad contiene filtros de intención. La ausencia de filtros significa que la actividad solo puede invocarse especificando su nombre de clase exacto. Esto implica que la actividad está destinada solo para uso interno de la aplicación (ya que otros no conocerían el nombre de la clase). Entonces, en este caso, el valor predeterminado es "falso". Por otro lado, la presencia de al menos un filtro implica que la actividad está destinada a un uso externo, por lo que el valor predeterminado es "verdadero".

Este atributo no es la única forma de limitar la exposición de una actividad a otras aplicaciones. También puede utilizar un permiso para limitar las entidades externas que pueden invocar la actividad (consulte el atributo de permiso).

Prateek Thakur
fuente
2
Solucione la mitad del problema para mí, si intenta instalar la aplicación con el servicio exportado primero, luego instale la aplicación principal, nunca podrá llegar a eliminar el servicio ... la otra forma funciona bien de todos modos ... Esto es porque el permiso requerido no está presente al instalar la aplicación principal, pero no sé cómo resolverlo sin eliminar los permisos ...
Bibu
102

Lo java.lang.SecurityExceptionque está viendo es porque puede ingresar dos entradas que apuntan a la misma actividad. Retire el segundo y debería estar listo para comenzar.

Más explicación

Puede ser declarado la actividad 2 veces en el manifiesto con diferentes propiedades, como:

 <activity android:name=".myclass"> </activity>

y

 <activity android:name=".myclass" android:label="@string/app_name"> 
     <intent-filter> 
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
 </activity>

Debes eliminar el no deseado del manifiesto.

Jomia
fuente
2
se le puede declarar la actividad 2 veces en el manifiesto con diferentes propiedades, como: <activity android: name = ". myclass"> </activity> y <activity android: name = ". myclass" android: label = "@ string / app_name "> <intent-filter> <action android: name =" android.intent.action.MAIN "/> <category android: name =" android.intent.category.LAUNCHER "/> </intent-filter> < / actividad>. debe eliminar el no deseado del manifiesto
Jomia
1
Gran respuesta jomia. Pero una pregunta, a la vez solo tengo una actividad de iniciador. Y el mismo código se ejecuta con eumlaotr pero en el dispositivo muestra una excepción de seguridad. ¿Puede explicar por favor?
Tofeeq Ahmad
Creo que tienes que desinstalar la aplicación en el dispositivo y volver a instalarla. Entonces funcionará
Jomia
16

En su archivo de manifiesto, escriba esto antes </application >

<activity android:name="com.fsck.k9.activity.MessageList">
   <intent-filter>
      <action android:name="android.intent.action.MAIN">
      </action>
   </intent-filter>
</activity>

y dime si resuelve tu problema :)

Muhammad Shahab
fuente
Bueno, al mirar los registros, estaba bastante seguro de que ayudaría. Haga una cosa: pegue su archivo de manifiesto completo aquí
Muhammad Shahab
<manifest xmlns: android = " schemas.android.com/apk/res/android " package = "com.i10n.notifier" android: versionCode = "1" android: versionName = "1.0"> <uses-permiso android: nombre = "android.permission.RECEIVE_BOOT_COMPLETED" /> <usa-permiso android: name = "android.permission.READ_CONTACTS" /> <usa-permiso android: name = "android.permission.READ_SYNC_SETTINGS" /> <usa-permiso android: name = "android.permission.READ_OWNER_DATA" /> <uses-allow android: name = "android.permission.ACCESS_NETWORK_STATE" />
Swathi EP
<usa-permiso android: name = "android.permission.INTERNET" /> <usa-permiso android: name = "android.permission.VIBRATE" /> <usa-permiso android: nombre = "android.permission.WAKE_LOCK" / > <usa-permiso android: name = "android.permission.WRITE_EXTERNAL_STORAGE" /> <aplicación android: icon = "@ drawable / icon" android: label = "@ string / app_name" android: theme = "@ android: style / Theme.NoTitleBar "> <actividad android: name =". GWVectraNotifier "android: label =" @ string / app_name "android: theme =" @ android: style / Theme.Dialog ">
Swathi EP
<intent-filter> <action android: name = "android.intent.action.MAIN" /> <category android: name = "android.intent.category.LAUNCHER" /> </intent-filter> </activity> < / application> </manifest>
Swathi EP
En los 3 comentarios anteriores, pegué el archivo de manifiesto de mi aplicación Notifier. Gracias por su respuesta.
Swathi EP
6

Me estaba encontrando con el mismo problema y quería evitar agregar el filtro de intención como lo describió. Después de investigar un poco, encontré un atributo xml android: exported que debe agregar a la actividad a la que le gustaría ser llamado.

De forma predeterminada, se establece en falso si no se agregó un filtro de intención a su actividad, pero si tiene un filtro de intención, se establece en verdadero.

aquí está la documentación http://developer.android.com/guide/topics/manifest/activity-element.html#exported

tl; dr: agregue android:exported="true"a su actividad en su archivo AndroidManifest.xml y evite agregar el filtro de intención :)

Jason
fuente
1

Asegúrese de que el componente tenga el indicador "exportado" establecido en verdadero. Además, el componente que define el permiso debe instalarse antes que el componente que lo usa.

Naren
fuente
También debe asegurarse de tener su aplicación en la partición system / priv-app para disfrutar del lujo del nivel del sistema. Esto es necesario en los dispositivos posteriores de KitKat
Naren
1

Es fácil, tal vez tenga un error en la configuración.

Por ejemplo: Manifest.xml

ingrese la descripción de la imagen aquí

Pero en mi configuración tengo por defecto Activity .Splash

ingrese la descripción de la imagen aquí

necesita verificar esta configuración y el archivo Manifest.xml

Buena suerte

David Hackro
fuente
1

target sdkResolví esta excepción cambiando la versión de la versión 19 en adelante kitkatAndroidManifest.xml.

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
Steve
fuente
Por cierto, por el momento Gradle se encarga de esto, y los desarrolladores de Android no especifican la versión sdk en el archivo de manifiesto
kiedysktos
1
Hay una solución terrible. Nunca apunte hacia abajo.
Jared Burrows
Esto funcionará, pero es muy probable que cause más problemas de los que resolvió. Esa es mi opinión
Evren Ozturk
0

Mi problema fue que tenía esto: incorrecto En lugar de esto: correcto

Uriel Frankel
fuente