tutorial studio start sendbroadcast registerreceiver oreo example connectivity_change android broadcastreceiver android-manifest android-permissions android-broadcastreceiver

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 con android: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.