android – “Le récepteur exporté ne nécessite aucune autorisation” sur les récepteurs destinés à recevoir des services système

J’ai des récepteurs déclarés dans mon AndroidManifest:

                    

Le premier est destiné à recevoir une action BOOT_COMPLETED . Le second est destiné à recevoir android.net.wifi.SCAN_RESULTS . Le troisième est destiné à recevoir certaines actions que je diffuse (intent_action_monitor) et certaines actions diffusées par AlarmManager (intent_action_setup_alarm etc).

Deux questions:

  • Pourquoi ne reçois-je pas l’avertissement sur tous les récepteurs?
  • Quelles permissions dois-je définir pour que les récepteurs destinés à recevoir les services système corrigent l’avertissement (je comprends ce dont il s’agit et je ne veux pas que quelqu’un utilise mes récepteurs de toute façon)? Est-ce que exported="false" fait pour les récepteurs de démarrage, les récepteurs wifi, les récepteurs d’alarme, etc. ?
    J’ai pensé à utiliser une autorisation personnalisée avec android:protectionLevel="signatureOrSystem" mais les docs déconseillent à la fois ce niveau de protection et les permissions personnalisées . Alors, comment dois-je gérer cet avertissement?

Les liens vers les documents et / ou un code seront très appréciés.

Pourquoi ne reçois-je pas l’avertissement sur tous les récepteurs?

Parce que les deux premiers sont clairement conçus pour être diffusés par Android. Le dernier est inconnu, en partie parce que vous n’avez pas fourni les valeurs de ressource de chaîne, et peut-être parce qu’elles sont vos propres chaînes d’action uniques.

Quelles permissions dois-je définir pour les récepteurs destinés à recevoir des services système pour corriger l’avertissement?

La solution correcte consiste à supprimer le . Si vous Intents ces Intents ou si vous Intents une Intent dans un object getBroadcast() PendingIntent , vous n’avez pas besoin de chaînes d’action. Utilisez le constructeur Intent qui prend l’object de classe Java comme second paramètre et utilisez-le:

 new Intent(this, BatteryMonitoringReceiver.class) 

Vous pouvez toujours attacher une chaîne d’action à cette Intent , si vous le souhaitez, mais vous pouvez vider le (le routage sera basé sur le composant fourni, dans ce cas la classe Java).

N’utilisez un lorsque vous vous attendez à ce que le système d’exploitation ou les applications tierces initient eux-mêmes l’ Intent (l’exécution d’un PendingIntent que vous avez créé ne compte pas).

L’avertissement “Le destinataire exporté ne nécessite pas de permission” signifie que vous avez un intent-filter d’ intent-filter avec certaines actions (par défaut, vous avez android:exported="true" et il peut désormais receive broadcasts de n’importe quel diffuseur en dehors de votre application ) Puisqu’il peut receive broadcasts de N’IMPORTE QUEL broadcasters dehors de votre application, il vous avertit en disant “Hé, es-tu sûr que TOUT radiodiffuseur peut t’invoquer? A mon avis, il est préférable que seuls vous avez défini pour ce receiver via android:permission"

Vous pouvez supprimer cet avertissement en ajoutant android:exported="false" au tag du destinataire

Si vous souhaitez exporter votre récepteur vers d’autres processus, vous pouvez append votre propre définition d’autorisation dans votre fichier manifeste android pour éviter cet avertissement, comme

    android:name=".receivers.BatteryMonitoringReceiver" android:permission="com.yourpage.permission.YOUR_PERMISSION" android:enabled="false" >       

pour plus d’informations, vous pouvez vous référer à http://developer.android.com/training/articles/security-tips.html

Si, comme moi, vous êtes ici parce que votre application créée avec une version antérieure du SDK a cessé de fonctionner avec des versions plus récentes et que vous souhaitez la réparer avec un minimum de modifications, ajoutez simplement

Android: exporté = faux

à l’étiquette du récepteur dans le fichier manifeste. La solution de CommonsWare est évidemment celle à suivre pour le long terme, mais cela résout le problème temporairement si vous utilisez des intentions personnalisées et que vous ne souhaitez pas les exporter.

Selon Lubo, vous devrez exporter cette autorisation personnalisée, qui invitera l’utilisateur avant l’installation. Cela signifie que le texte descriptif de la permission doit être bien écrit pour que vous ne fassiez pas peur à l’utilisateur de changer d’avis sur l’installation de l’application. En outre, il devrait être traduit dans toutes vos langues cibles.