2011-02-25 18 views
35

Estoy a punto de implementar C2DM para mi aplicación, pero creo que el documentation es un poco confuso con respecto a cómo escribir el manifiesto.C2DM: cómo usar el permiso C2D_MESSAGE?

El ejemplo de código manifiesto contiene esto:

<!-- Only this application can receive the messages and registration result --> 
<permission android:name="com.example.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
<uses-permission android:name="com.example.myapp.permission.C2D_MESSAGE" /> 

Esto se explica de la siguiente manera:.

applicationPackage +" .permission.C2D_MESSAGE impide que otras aplicaciones de registro y recepción de mensajes de la aplicación

Pero, ¿cómo funciona esto exactamente? Según tengo entendido, esto declara un permiso y luego lo obtiene permiso para mi aplicación Pero, ¿dónde exactamente se aplica ese permiso?

El código dado para la inscripción es:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); 
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate 
registrationIntent.putExtra("sender", emailOfSender); 
startService(registrationIntent); 

¿Cómo puede el servicio que recibe el registrationIntent sabe lo que el permiso para comprobar si hay? Como entiendo (y me corrigen si estoy equivocado aquí), al declarar el permiso, pude haber elegido cualquier nombre de permiso dentro de mi espacio de nombres, p. com.example.myapp.permission.WHATEVER.

¿O es C2D_MESSAGE alguna constante mágica que tengo que usar?


Además, la documentación dice que tengo que poner en práctica los receptores de com.google.android.c2dm.intent.C2D_MESSAGE y com.google.android.c2dm.intent.REGISTRATION Intentos. Pero en el ejemplo del código, los filtros del receptor solo contienen .intent.RECEIVE y .intent.REGISTRATION Intents. ¿A dónde se dirigió C2D_MESSAGE, y tiene algo que hacer con mi la pregunta anterior?

Espero que esto no sea algo obvio, pero simplemente no lo entiendo ... por favor ayuda.

Respuesta

23

Los receptores que afirman necesitar en la parte superior del resumen parecen ser un error en la documentación, ya que no coinciden con el ejemplo de manifiesto.

"Receptores para com.google.android.c2dm.intent.C2D_MESSAGE y com.google.android.c2dm.intent.REGISTRATION").

me los ejemplos que dan a trabajar utilizando simplemente las entradas de manifiesto de ejemplo ajustadas para que coincidan con el nombre del paquete de mi aplicación en particular.

Cuando el código C2DM en Android envía la transmisión a cabo (o, más bien, cuando se mira para los receptores potenciales para enviar la emisión a), busca:

receptores Búsqueda de emisoras para Intención: com .google.android.c2dm.intent.REGISTRATION que tienen el permiso: .permission.C2D_MESSAGE

Todos los mensajes enviados a C2DM su aplicación por el código de Android C2DM estarán buscando ese permiso particular. Es específico para su aplicación, y simplemente necesita estar en esa estructura (el paquete de su aplicación + ".permission.C2D_MESSAGE ")

En cuanto a la forma en la solicitud de registro se pone el nombre del paquete que se utilizará para los permisos, que se maneja la primera vez que se registra en el. 'aplicación' extra - a partir de la documentación:

" aplicación es el ID de la aplicación, ajuste a una PendingIntent para permitir que el servicio de registro para extraer información de la aplicación "

la línea en cuestión:.

registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate 
+0

Entonces, ¿qué sucede si no declaro y necesito el permiso C2D_MESSAGE? ¿No podré recibir transmisiones de c2dm? Esto significaría que el comentario en mi primer bloque de código debería decir "asegúrese de que podamos recibir transmisiones de c2dm _at all_" – user634618

+0

A juzgar por la documentación, si no declara ese permiso, entonces la parte de C2DM que busca BroadcastReceivers que pueda manejar el intento (y tener el permiso) no encontrará ningún BroadcastReceivers para probar, por lo que la transmisión no irá a ninguna parte. No lo he intentado, pero sería muy fácil de probar. Antes, seguiría los ejemplos de los documentos para asegurarme de que todo está funcionando. – mbafford

+1

Gracias, leí la documentación de BroadcastReceiver nuevamente y ahora lo entiendo. Lo que no noté cuando lo leí la primera vez es que al activar un Intento de transmisión, se puede requerir explícitamente un permiso. – user634618

Cuestiones relacionadas