77 votes

android - "Le destinataire exporté ne nécessite pas d'autorisation" sur les destinataires destinés à recevoir des services système

J'ai certains récepteurs déclarés dans mon manifeste :

<receiver <!-- no warning -->
    android:name=".receivers.TriggerMonitoringBootReceiver"
    android:enabled="false" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
<receiver <!-- no warning -->
    android:name=".receivers.ScanResultsReceiver"
    android:enabled="false" >
    <intent-filter>
        <action android:name="android.net.wifi.SCAN_RESULTS" />
    </intent-filter>
</receiver>
<receiver <!-- warning : Exported receiver does not require permission-->
    android:name=".receivers.BatteryMonitoringReceiver"
    android:enabled="false" >
    <intent-filter>
        <action android:name="@string/intent_action_setup_alarm" />
        <action android:name="@string/intent_action_cancel_alarm" />
        <action android:name="@string/intent_action_monitor" />
    </intent-filter>
</receiver>

La première est destinée à recevoir un BOOT_COMPLETED action. La seconde est destinée à recevoir android.net.wifi.SCAN_RESULTS. La troisième est destinée à recevoir certaines actions de diffusion (intent_action_monitor) et certaines actions émises par la AlarmManager (intent_action_setup_alarm etc).
Deux questions :

  • Pourquoi je ne reçois pas le message d'avertissement sur tous les récepteurs ?
  • Les autorisations que dois-je créer pour les récepteurs destinés à recevoir le système de services de corriger l'avertissement (je comprends de quoi il s'agit et je ne veux pas que quiconque d'utiliser mon récepteurs de toute façon) ? Va exported="false" faire pour démarrer les récepteurs wifi, les récepteurs, les récepteurs d'alarme etc ?
    Je pensais de l'aide personnalisé avec la permission android:protectionLevel="signatureOrSystem" mais les docs de conseiller à la fois à ce niveau de protection et d'autorisations personnalisées. Alors, comment je doit gérer cet avertissement ?

Des liens vers les docs et/ou du code sera apprécié.

71voto

CommonsWare Points 402670

Pourquoi je ne reçois pas le message d'avertissement sur tous les récepteurs ?

Parce que les deux premiers sont clairement destinées à être diffusées par Android. Le dernier est inconnu, en partie parce que vous n'avez pas d'approvisionnement de la chaîne de valeurs de la ressource, et probablement parce qu'ils sont de votre propre action des cordes.

Les autorisations que dois-je créer pour les récepteurs destinés à recevoir le système de services de corriger l'avertissement

La bonne solution est de supprimer l' <intent-filter>. Si vous êtes à la radiodiffusion ces Intents, ou si vous êtes l'enchaînement d'un Intent en getBroadcast() PendingIntent, vous n'avez pas besoin de l'action des cordes. Utiliser l' Intent constructeur qui prend la Java de la classe de l'objet en tant que second paramètre, et de l'utiliser:

new Intent(this, BatteryMonitoringReceiver.class)

Vous êtes les bienvenus à toujours attacher une chaîne d'action pour que l' Intent, si vous voulez, mais vous pouvez vider le <intent-filter> (routage sera basé sur le composant fourni, dans ce cas, la classe Java).

Utilisez seulement un <intent-filter> lorsque vous attendez le système d'exploitation ou d'applications tierces pour lancer l' Intent eux-mêmes (l'exécution d'un PendingIntent que vous avez créé ne compte pas).

25voto

Lubo Points 91

Si vous souhaitez exporter votre récepteur vers d'autres processus, vous pouvez ajouter votre propre définition d'autorisation dans votre fichier android-manifeste pour éviter cet avertissement, comme par exemple

 <permission
    android:name="com.yourpage.permission.YOUR_PERMISSION"
    android:protectionLevel="normal" />

<uses-permission
    android:name="com.yourpage.permission.YOUR_PERMISSION" />

<receiver <!-- warning : Exported receiver does not require permission-->
    android:name=".receivers.BatteryMonitoringReceiver"
    android:permission="com.yourpage.permission.YOUR_PERMISSION"
    android:enabled="false" >
    <intent-filter>
        <action android:name="@string/intent_action_setup_alarm" />
        <action android:name="@string/intent_action_cancel_alarm" />
        <action android:name="@string/intent_action_monitor" />
    </intent-filter>
</receiver> 
 

Pour plus d'informations, vous pouvez consulter http://developer.android.com/training/articles/security-tips.html

4voto

navjotk Points 372

Si, comme moi, vous êtes ici parce que votre application construite avec une précédente version du SDK arrêté de travailler avec les versions les plus récentes et vous souhaitez le fixer avec un minimum de changements, il suffit d'ajouter

android:exportées=false

pour le récepteur de balise dans le fichier manifeste. La solution par CommonsWare est évidemment l'un pour aller avec pour le long terme, mais cela résout le problème temporairement si vous êtes en utilisant des intentions et ne veux pas les exporter.

En passant par Lubo, vous auriez besoin d'exporter cette autorisation personnalisée, ce qui inciterait à l'utilisateur avant l'installation. Cela signifie que le texte descriptif de l'autorisation doit être bien écrit, afin de ne pas effrayer l'utilisateur en changeant d'avis à propos de l'installation de l'application. Aussi, il devra être traduit dans toutes vos langues cibles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X