Ich habe einige Empfänger in meinem AndroidManifest deklariert:
<!-- no warning -->
<receiver
android:name=".receivers.TriggerMonitoringBootReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<!-- no warning -->
<receiver
android:name=".receivers.ScanResultsReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.net.wifi.SCAN_RESULTS" />
</intent-filter>
</receiver>
<!-- warning : Exported receiver does not require permission-->
<receiver
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>
Der erste soll eine BOOT_COMPLETED
Aktion erhalten. Der zweite soll empfangen android.net.wifi.SCAN_RESULTS
. Die dritte soll einige Aktionen empfangen, die ich gesendet habe (intent_action_monitor), und einige Aktionen, die vom AlarmManager
(intent_action_setup_alarm usw.) gesendet werden .
Zwei Fragen:
- Warum erhalte ich nicht die Warnung auf allen Empfängern?
- Welche Berechtigungen muss ich für Empfänger festlegen , die von Systemdiensten empfangen werden sollen, um die Warnung zu korrigieren (ich verstehe, worum es geht, und ich möchte sowieso nicht, dass jemand meine Empfänger verwendet)? Werden
exported="false"
Sie für die Boot - Empfänger, Wi - Fi - Empfänger, Alarmempfänger usw. ?
Ich habe überlegt, eine benutzerdefinierte Berechtigung mit zu verwenden,android:protectionLevel="signatureOrSystem"
aber die Dokumente raten sowohl von dieser Schutzstufe als auch von benutzerdefinierten Berechtigungen ab . Wie soll ich mit dieser Warnung umgehen?
Links zu den Dokumenten und / oder einem Code werden sehr geschätzt.
quelle
exported="false"
einen Unterschied? (Nebenbei: Ich benötige die Aktionen, aber Ihre Klarstellung "Verwenden Sie einen <intent-filter> nur, wenn Sie erwarten, dass das Betriebssystem oder Apps von Drittanbietern den Intent selbst initiieren (das Ausführen eines von Ihnen erstellten PendingIntent zählt nicht)." Ist sehr wichtig sehr willkommen - +1)Die Warnung "Exportierter Empfänger benötigt keine Berechtigung" bedeutet, dass Sie eine
intent-filter
Aktion ausführen (was bedeutet, dass Sie standardmäßig festgelegt habenandroid:exported="true"
und dies jetztreceive broadcasts
von JEDEN Sendern außerhalb Ihrer Anwendung möglich istapplication
). Da diesreceive broadcasts
von JEDEMbroadcasters
außerhalb Ihrer Anwendung möglich ist, werden Sie gewarnt mit den Worten „Hey, bist du sicher , dass jeder Fernsehveranstalter können Sie aufrufen? meiner Meinung nach ist es besser , wenn man nur diejenigen , erlaubenbroadcasters
Sie aufzurufen, muss diepermission
Sie für diese festgelegt habenreceiver
durchandroid:permission"
Sie können diese Warnung entfernen, indem Sie
android:exported="false"
sie dem Empfänger-Tag hinzufügenquelle
Wenn Sie Ihren Empfänger in andere Prozesse exportieren möchten, können Sie Ihre eigene Berechtigungsdefinition in Ihre Android-Manifest-Datei einfügen, um diese Warnung zu vermeiden
<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>
Weitere Informationen finden Sie unter http://developer.android.com/training/articles/security-tips.html
quelle
Wenn Sie wie ich hier sind, weil Ihre mit einer früheren SDK-Version erstellte App nicht mehr mit neueren Versionen funktioniert und Sie sie mit minimalen Änderungen beheben möchten, fügen Sie einfach hinzu
an das Empfänger-Tag in der Manifest-Datei. Die Lösung von CommonsWare ist natürlich die langfristige Lösung, aber dies behebt das Problem vorübergehend, wenn Sie benutzerdefinierte Absichten verwenden und diese nicht exportieren möchten.
Nach Lubos Art müssten Sie diese benutzerdefinierte Berechtigung exportieren, die den Benutzer vor der Installation auffordert. Das bedeutet, dass der beschreibende Text für die Berechtigung gut geschrieben sein muss, damit Sie den Benutzer nicht dazu bringen, seine Meinung über die Installation der App zu ändern. Außerdem müsste es in alle Ihre Zielsprachen übersetzt werden.
quelle