web-dev-qa-db-fra.com

Android: Java.lang.SecurityException: refus d'autorisation: démarrage de l'intention

J'ai créé une application contenant une activité GWVectraNotifier qui est appelée depuis d'autres applications pour afficher Notification.

Dans la boîte de dialogue Notification, il y aura un bouton "Afficher" et un bouton "Fermer".

Cliquez sur le bouton "Afficher" pour lancer l'activité correspondante.

Pour vérifier la fonctionnalité de l'application ci-dessus,

J'ai démarré l'activité GWVectraNotifier à partir de l'application K9Mail sur le déclencheur d'événement checkmail.

Je suis capable de démarrer l'activité de GWVectraNotifier avec succès, mais en cliquant sur le bouton 'afficher', je vais devoir démarrer l'activité 'MessageList' de K9mail. Pour ce faire, j'ai écrit le code ci-dessous:

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

qui jette:

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 fait, je ne suis pas en mesure de comprendre les autorisations à inclure dans le fichier manifeste de mon application Notifier pour accéder à MessageList de k9Mail. Je colle ci-dessous les autorisations incluses dans le fichier manifeste de l'application 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"/>           

Quelqu'un peut-il me dire quelle autorisation inclure dans mon application? Dans les autorisations ci-dessus, certaines ne concernent que k9mail, car ce sont les classes d'autorisation écrites pour k9. Ainsi, je ne pourrai inclure que les autorisations intégrées de Android dans les autorisations données ci-dessus. J'ai essayé en même temps, mais cela n'a pas résolu mon problème :(

110
Swathi EP

Vous devez ajouter Android:exported="true" dans le fichier manifeste de l'activité que vous essayez de démarrer.

Depuis le Android: documentation exportée :

Android: exporté
Si l'activité peut ou non être lancée par des composants d'autres applications - "true" si elle peut l'être et "false" si ce n'est pas le cas. Si "false", l'activité ne peut être lancée que par des composants de la même application ou des applications avec le même ID utilisateur.

La valeur par défaut dépend de si l'activité contient des filtres d'intention. L'absence de filtres signifie que l'activité ne peut être invoquée qu'en spécifiant son nom de classe exact. Cela implique que l'activité est uniquement destinée à un usage interne à l'application (car d'autres ne connaîtront pas le nom de la classe). Donc, dans ce cas, la valeur par défaut est "false". D'autre part, la présence d'au moins un filtre implique que l'activité est destinée à un usage externe, la valeur par défaut est donc "true".

Cet attribut n'est pas le seul moyen de limiter l'exposition d'une activité à d'autres applications. Vous pouvez également utiliser une autorisation pour limiter les entités externes pouvant appeler l'activité (voir l'attribut permission).

155
Prateek Thakur

Le Java.lang.SecurityException que vous voyez est dû au fait que vous pouvez entrer deux entrées pointant vers la même activité. Retirez le second et vous devriez être prêt à partir.

Plus d'explications

Vous pouvez être déclaré l'activité 2 fois dans le manifeste avec des propriétés différentes, telles que:

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

et

 <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>

Vous devez supprimer le plus indésirable du manifeste

101
Jomia

Dans votre fichier Manifest, écrivez ceci avant </application >

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

et dites-moi si cela résout votre problème :)

15
Muhammad Shahab

J'ai eu ce problème avec cette activité exacte.

Vous ne pouvez pas démarrer com.fsck.k9.activity.MessageList à partir d'une activité externe.

Je l'ai résolu avec:

Intent LaunchK9 = getPackageManager().getLaunchIntentForPackage("com.fsck.k9");this.startActivity(LaunchK9);

Utilisation de http://developer.Android.com/reference/Android/content/pm/PackageManager.html

7
user1305537

Je rencontrais le même problème et je voulais éviter d'ajouter le filtre d'intention comme vous l'avez décrit. Après quelques recherches, j'ai trouvé un attribut XML Android: exporté que vous devez ajouter à l'activité que vous souhaitez appeler.

Il est défini par défaut sur false si aucun filtre d'intention n'a été ajouté à votre activité, mais si vous disposez d'un filtre d'intention, il est défini sur true.

voici la documentation http://developer.Android.com/guide/topics/manifest/activity-element.html#exported

tl; dr: addAndroid:exported="true" à votre activité dans votre fichier AndroidManifest.xml et évitez d’ajouter le filtre d’intention :)

6
Jason

Assurez-vous que l'indicateur "exporté" du composant est défini sur true. De plus, le composant définissant l'autorisation doit être installé avant le composant qui l'utilise.

1
Naren

J'ai résolu cette exception en modifiant la version target sdk à partir de 19 ans la version KitKat AndroidManifest.xml.

<uses-sdk
        Android:minSdkVersion="8"
        Android:targetSdkVersion="19" />
1
Stephen

C'est facile peut-être que vous avez une erreur dans la configuration.

Par exemple: Manifest.xml

enter image description here

Mais dans ma configuration, vous avez pour activité par défaut .Splash

enter image description here

vous devez vérifier cette configuration et le fichier Manifest.xml

Bonne chance

1
David Hackro

Mon problème était que j'avais ceci: wrong Au lieu de cela: correct

0
Uriel Frankel