starting - Android: java.lang.SecurityException: denegación de permiso: intención de inicio
security exception permission denial traduccion (9)
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 utiliza.
He creado una aplicación que contiene la actividad GWVectraNotifier a la 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 verificar la funcionalidad de la aplicación anterior,
Inicié la actividad de GWVectraNotifier desde la aplicación K9Mail en el desencadenante del evento checkmail.
Puedo iniciar la actividad 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 debajo de 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"/>
¿Puede alguien 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 incorporados de Android en los permisos dados anteriormente. Intenté hacerlo también, pero no resolvió mi problema :(
En su archivo Manifiesto, escriba esto antes de </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 :)
La java.lang.SecurityException
que está viendo se debe a que puede ingresar dos entradas que apuntan a la misma actividad. Quita el segundo y deberías estar listo para ir.
Más Explicación
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>
</activity>
Debe eliminar el no deseado del manifiesto
Me encontré con el mismo problema y quería evitar agregar el filtro de intención como describió. Después de excavar, encontré un atributo xml android: exportado que debe agregar a la actividad que desea que se llame.
Está configurado por defecto en falso si no se ha agregado ningún 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 :)
Resolví esta excepción cambiando la versión target sdk
de 19 en adelante a kitkat versión AndroidManifest.xml.
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
Tuve este problema con esta actividad exacta.
No puede iniciar com.fsck.k9.activity.MessageList a partir de una actividad externa.
Lo resolví con:
Intent LaunchK9 = getPackageManager().getLaunchIntentForPackage("com.fsck.k9");
this.startActivity(LaunchK9);
Usando http://developer.android.com/reference/android/content/pm/PackageManager.html
android:exported="true"
agregar android:exported="true"
en el archivo de manifiesto de la actividad que está intentando iniciar.
Desde el Android: documentación exportada :
Android: exportado
Si los componentes de otras aplicaciones pueden iniciar o no la actividad, "verdadero" si es posible y "falso" si no es así. Si es "falso", la actividad solo puede iniciarse con 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 solo se puede invocar la actividad especificando su nombre de clase exacto. Esto implica que la actividad está destinada solo para el 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 para 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 usar un permiso para limitar las entidades externas que pueden invocar la actividad (consulte el atributo de permiso).