2011-02-25 15 views
35

Sto per implementare C2DM per la mia applicazione, ma trovo il documentation un po 'di confusione su come scrivere il manifest.C2DM: come utilizzare l'autorizzazione C2D_MESSAGE?

L'esempio di codice manifesto contiene questo:

<!-- 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" /> 

Questo è spiegato come segue:.

applicationPackage +" .permission.C2D_MESSAGE impedisce ad altre applicazioni di registrazione e ricezione di messaggi dell'applicazione

Ma come funziona esattamente? Come ho capito, questo dichiara un permesso e poi ottiene permesso per la mia app. Ma dove è esattamente quel permesso applicato?

Il codice dato per l'iscrizione è:

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); 

Come può il servizio che riceve il registrationIntent sa cosa il permesso di verificare la presenza di? Come ho capito (e correggermi se ho torto qui), quando dichiaro il permesso, potrei aver scelto qualsiasi nome di permesso all'interno del mio spazio dei nomi, ad es. com.example.myapp.permission.WHATEVER.

Oppure C2D_MESSAGE è una costante di magia che devo usare?


Inoltre, la documentazione dice che devo implementare ricevitori per com.google.android.c2dm.intent.C2D_MESSAGE e com.google.android.c2dm.intent.REGISTRATION Intenti. Ma nell'esempio di codice, i filtri del destinatario contengono solo .intent.RECEIVE e .intent.REGISTRATION Intenti. Dove è andato C2D_MESSAGE e ha qualcosa da fare con la mia domanda sopra?

Spero che questo non sia qualcosa di ovvio, ma proprio non capisco ... per favore aiutatemi.

risposta

23

I ricevitori che ritengono necessario in alto nel riepilogo sembrano essere un errore nella documentazione, in quanto non corrisponde all'esempio manifest.

"Ricevitori per com.google.android.c2dm.intent.C2D_MESSAGE e com.google.android.c2dm.intent.REGISTRATION.")

mi sono gli esempi che danno al lavoro utilizzando semplicemente le voci manifest di esempio sono ottimizzate per corrispondere al nome del pacchetto della mia particolare applicazione.

Quando il codice C2DM in Android invia l'onda fuori (o, meglio, quando si guarda per i potenziali destinatari per fare la trasmissione a), cerca:

ricevitori Ricerca di trasmissione per Intent: com .google.android.c2dm.intent.REGISTRATION che ha l'autorizzazione: .permission.C2D_MESSAGE

Tutti i messaggi inviati C2DM alla vostra applicazione dal codice C2DM Android saranno in cerca di quel permesso particolare. È specifico per la tua applicazione e deve semplicemente essere in quella struttura (pacchetto della tua applicazione + ".permission.C2D_MESSAGE ")

su come la richiesta di registrazione ottiene il nome del pacchetto da utilizzare per i permessi, che viene gestito prima volta che si registri con il. 'app' extra - dalla documentazione:

" app è ID dell'applicazione, insieme con un PendingIntent per consentire al servizio di registrazione per estrarre informazioni sulle applicazioni "

la linea in questione:.

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

Cosa succede se non dichiaro e richiedo l'autorizzazione C2D_MESSAGE? Non potrò quindi ricevere alcuna trasmissione c2dm? Ciò significherebbe che il commento nel mio primo blocco di codice dovrebbe effettivamente leggere "assicurati di poter ricevere trasmissioni c2dm _at all_" – user634618

+0

Giudicando dalla documentazione, se non dichiari tale autorizzazione, la parte di C2DM che cerca BroadcastRece che può gestire l'intento (e avere il permesso) non troverà nessun BroadcastReceiver da provare, quindi il Broadcast non andrà da nessuna parte. Non l'ho provato, ma sarebbe davvero semplice da provare. Seguirò prima gli esempi dei documenti per essere sicuro che tutto funzioni, innanzitutto. – mbafford

+1

Grazie, ho letto di nuovo la documentazione di BroadcastReceiver e ora la capisco. Quello che non ho notato leggendolo la prima volta è che quando si spara una trasmissione Intent si può richiedere esplicitamente un permesso. – user634618

Problemi correlati