studio - start broadcast receiver android
android-"El receptor exportado no requiere permiso" en los receptores destinados a recibir de los servicios del sistema (4)
¿Por qué no recibo la advertencia en todos los receptores?
Porque los dos primeros están claramente diseñados para ser transmitidos por Android. El último es desconocido, en parte porque no proporcionó los valores del recurso de cadena, y posiblemente porque son sus propias cadenas de acción únicas.
¿Qué permisos debo configurar para los receptores destinados a recibir de los servicios del sistema para corregir la advertencia?
La solución correcta es eliminar el <intent-filter>
. Si está transmitiendo estos Intents
, o si está getBroadcast()
un Intent
en un getBroadcast()
PendingIntent
, no necesita cadenas de acción. Use el constructor Intent
que toma el objeto de la clase Java como el segundo parámetro, y use eso:
new Intent(this, BatteryMonitoringReceiver.class)
Puede adjuntar una cadena de acción a ese Intent
, si lo desea, pero puede volcar el <intent-filter>
(el enrutamiento se basará en el componente suministrado, en este caso, la clase Java).
Solo use un <intent-filter>
cuando espere que el SO o las aplicaciones de terceros inicien Intent
(ejecutar un PendingIntent
que haya creado no cuenta).
Tengo algunos receptores declarados en mi AndroidManifest:
<!-- 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>
El primero está destinado a recibir una acción BOOT_COMPLETED
. El segundo está destinado a recibir android.net.wifi.SCAN_RESULTS
. El tercero está destinado a recibir algunas acciones que transmito (intent_action_monitor) y algunas acciones emitidas por AlarmManager
(intent_action_setup_alarm, etc.).
Dos preguntas:
- ¿Por qué no recibo la advertencia en todos los receptores?
- ¿Qué permisos debo configurar para receptores destinados a recibir de los servicios del sistema para corregir la advertencia (comprendo de qué se trata y no quiero que nadie use mis receptores de todos modos)? ¿Se
exported="false"
para receptores de arranque, receptores wifi, receptores de alarma, etc. ?
Pensé en usar un permiso personalizado conandroid:protectionLevel="signatureOrSystem"
pero los documentos desaconsejan tanto este nivel de protección como los permisos personalizados . Entonces, ¿cómo debo manejar esta advertencia?
Los enlaces a los documentos y / o algún código serán muy apreciados.
La advertencia "Receptor exportado no requiere permiso" significa que tiene un intent-filter
con alguna acción (lo que significa que tiene predeterminado android:exported="true"
establecido y ahora puede receive broadcasts
de CUALQUIER emisora fuera de su application
) Como puede receive broadcasts
de CUALQUIER broadcasters
fuera de su aplicación, le avisa diciendo "Oye, ¿estás seguro de que CUALQUIER emisora puede llamarte? En mi opinión, es mejor si permites que solo las broadcasters
te invoquen que tenga el permission
has configurado para este receiver
través de android:permission"
Puede eliminar esta advertencia agregando android:exported="false"
a la etiqueta del receptor
Si desea exportar su receptor a otros procesos, puede agregar su propia definición de permiso en su archivo de manifiesto de Android para evitar esta advertencia, como
<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>
Para obtener más información, puede consultar http://developer.android.com/training/articles/security-tips.html
Si, como yo, estás aquí porque tu aplicación creada con una versión anterior del SDK dejó de funcionar con versiones más recientes y te gustaría solucionarla con un cambio mínimo, simplemente agrega
android: exported = falso
a la etiqueta del receptor en el archivo de manifiesto. La solución de CommonsWare es, obviamente, la que se aplicará a largo plazo, pero esto soluciona el problema temporalmente si está utilizando intenciones personalizadas y no tiene la intención de exportarlas.
Siguiendo el camino de Lubo, necesitaría exportar este permiso personalizado, que solicitaría al usuario antes de la instalación. Eso significa que el texto descriptivo para el permiso debe estar bien escrito para que no termine asustando al usuario y cambie de opinión sobre la instalación de la aplicación. Además, debería traducirse a todos los idiomas de destino.