web-dev-qa-db-fra.com

C2DM: Comment utiliser l'autorisation C2D_MESSAGE?

Je suis sur le point d'implémenter C2DM pour mon application, mais je trouve la documentation un peu confuse quant à la façon d'écrire le manifeste.

L'exemple de code manifeste contient ceci:

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

Cela s'explique comme suit:

applicationPackage + ".permission.C2D_MESSAGE empêche les autres applications d'enregistrer et de recevoir les messages de l'application.

Mais comment cela fonctionne-t-il exactement? Si je comprends bien, cela déclare une autorisation, puis obtient cette autorisation pour mon application. Mais où exactement cette autorisation est-elle appliquée?

Le code donné pour l'inscription est:

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

Comment le service qui reçoit l'inscriptionIntent peut-il savoir quelle autorisation vérifier? Si je comprends bien (et corrigez-moi si je me trompe ici), lors de la déclaration de l'autorisation, j'aurais pu choisir n'importe quel nom d'autorisation dans mon espace de noms, par ex. com.example.myapp.permission.WHATEVER.

Ou est-ce que C2D_MESSAGE est une constante magique que je dois utiliser?


De plus, la documentation indique que je dois implémenter des récepteurs pour com.google.Android.c2dm.intent.C2D_MESSAGE et com.google.Android.c2dm.intent.REGISTRATION Intentions. Mais dans l'exemple de code, les filtres du récepteur contiennent uniquement .intent.RECEIVE et .intent.REGISTRATION Intentions. Où est-ce que C2D_MESSAGE allez, et y a-t-il quelque chose à faire avec ma question ci-dessus?

J'espère que ce n'est pas quelque chose d'évident, mais je ne comprends pas ... s'il vous plaît, aidez-moi.

35
user634618

Les récepteurs dont ils prétendent avoir besoin en haut du résumé semblent être une erreur dans la documentation, car cela ne correspond pas à l'exemple du manifeste.

"Récepteurs pour com.google.Android.c2dm.intent.C2D_MESSAGE et com.google.Android.c2dm.intent.REGISTRATION.")

J'ai obtenu les exemples qu'ils donnent au travail en utilisant simplement les exemples d'entrées de manifeste modifiés pour correspondre au nom du package de mon application particulière.

Lorsque le code C2DM dans Android envoie la diffusion (ou, plutôt, lorsqu'il recherche des récepteurs potentiels pour envoyer la diffusion), il recherche:

Rechercher des récepteurs de diffusion pour Intent: com.google.Android.c2dm.intent.REGISTRATION Qui ont l'autorisation: . Permission.C2D_MESSAGE

Tous les messages C2DM envoyés à votre application par le Android code C2DM recherchera cette autorisation particulière. Il est spécifique à votre application et doit simplement être dans cette structure (le package de votre application + ". permission.C2D_MESSAGE ").

En ce qui concerne la façon dont la demande d'enregistrement obtient le nom du package à utiliser pour les autorisations, cela est géré lorsque vous vous inscrivez pour la première fois avec l'application "extra" - à partir de la documentation:

"app est l'ID de l'application, défini avec un PendingIntent pour permettre au service d'enregistrement d'extraire les informations de l'application."

la ligne en question:

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