Pregunta

Si registro un receptor de transmisión, diga en mi actividad como esta,

@Override
protected void onResume() {
    super.onResume();

    myReceiver = new BroadcastReceiver() { ... };
    IntentFilter filter = new IntentFilter("com.example.MY_ACTION");
    registerReceiver(myReceiver, filter);
}

es este receptor exportado?Si otra aplicación transmite com.example.MY_ACTION, ¿será recibido por myReceiver?

Si es así, asumo que necesito usar la forma de registerReceiver() que acepta un permiso de cadena y luego defina ese permiso en mi manifiesto, dándole un alto nivel de protección (como la firma).¿Es eso correcto?¿Hay una forma más sencilla?

gracias.

¿Fue útil?

Solución

de los documentos de la API en la API de BroadcastReceiver:

Si no necesita enviar transmisiones en todas las aplicaciones, considere Usando esta clase con localbroadcastmanager en lugar de cuanto más Instalaciones generales que se describen a continuación.Esto te dará mucho más. Implementación eficiente (no se necesita comunicación cruzada) y Le permite evitar pensar en cualquier problema de seguridad relacionado con otros Aplicaciones que pueden recibir o enviar sus transmisiones.

De esa manera, al menos puede mantener al receptor solo dentro de su solicitud.

Otros consejos

Para ahorrar a otros el trabajo y para mis propios fines de archivo: Sí, los receptores registrados en contexto son exportados por defecto.

No parece haber mucha Documentación pero usted Puede validar esto rápidamente ejecutando una aplicación separada enviando una transmisión personalizada. Probé esto en API 16-29, se recibirá la transmisión y, por lo tanto, cada paquete podrá enviar a su receptor (que puede ser una falla de seguridad).


Para resolver el problema sin usar transmisiones locales ( debe usarse siempre que sea posible ) está en la pista correcta para definir un permiso personalizado y restringiendo las transmisiones a las aplicaciones que han solicitado ese permiso . Por el bien de la integridad:

Defina y use un permiso personalizado en el manifiesto:

<permission android:name="com.example.bcrtest.BROADCAST_PERMISSION"
    android:protectionLevel="signature"/>
<uses-permission android:name="com.example.bcrtest.BROADCAST_PERMISSION" />

Registrar receptor con permiso:

registerReceiver(mReceiver, new IntentFilter(MY_INTENT_ACTION), "com.example.bcrtest.BROADCAST_PERMISSION", null );

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top