2010-09-05 26 views
6

J'essaie de tester le framework C2DM. J'ai reçu l'e-mail de confirmation il y a quelques jours, puis j'ai essayé de créer un client pouvant m'inscrire. Pour cela, j'ai créé un client simple en suivant les étapes décrites dans ce tutoriel: http://code.google.com/intl/es-419/android/c2dm/index.html.Problème d'enregistrement pour C2DM sous Android

Le fichier manifeste Android contient entre autres ce code:

<permission android:name="com.bilthon.ufrj.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
<uses-permission android:name="com.bilthon.ufrj.permission.C2D_MESSAGE" /> 

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<uses-permission android:name="android.permission.INTERNET"/> 

<receiver android:name=".C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND"> 

<intent-filter> 
    <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
    <category android:name="com.bilthon.ufrj" /> 
</intent-filter> 

<intent-filter> 
    <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
    <category android:name="com.bilthon.ufrj" /> 
</intent-filter> 
</receiver> 

Et puis, l'activité principale lancée au démarrage du programme a le code suivant:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); 
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate 
registrationIntent.putExtra("sender","[email protected]"); 
Log.d("WelcomeScreen","[email protected]"); 
startService(registrationIntent); 

J'ai aussi enregistré un Google compte sur l'AVD exécutant mon client, comme ils l'ont dit était nécessaire. Mais le problème est que je n'arrive pas à réveiller le récepteur de diffusion. Je ne sais pas ce qui pourrait mal se passer. En analysant les logs, je peux voir que l'intention d'enregistrement est créée et apparemment utilisée correctement, mais le code du récepteur n'est jamais exécuté, qu'est-ce qui pourrait être faux?

Merci à l'avance Nelson

Répondre

9

Eh bien .. juste trié, le problème était avec la déclaration du récepteur. Les étiquettes pour le récepteur doivent aller à l'intérieur de la balise d'application, comme démontré ici: http://developer.android.com/guide/topics/manifest/manifest-intro.html

Voici un exemple de manifeste bien formulé pour une application C2DM. Merci à Mark Murphy pour avoir posté le lien sur le groupe android-c2dm.

Et désolé pour l'erreur idiote.

Nelson

1

choses que vous pouvez vérifier:

J'ai remarqué est que vous déclarez une autorisation C2DM mais ne utilisation dans votre application comme ceci:

<uses-permission android:name="com.bilthon.ufrj.permission.C2D_MESSAGE" /> 

Si vous avez un oeil à la bibliothèque C2DM vous verrez que le helpe La méthode C2DMessagingregister crée l'intention avec un appel supplémentaire à setPackage.

registrationIntent.setPackage("com.google.android.gsf"); 
+0

Je suis désolé, je dois avoir fait une erreur en copiant le texte ici, parce que je viens de vérifier mon manifeste et il a une ligne comme celle que vous dites est manquant.Et pour la deuxième partie de votre réponse, je dois dire que je n'essaie même pas d'envoyer un message pour le moment. J'essaie juste d'enregistrer l'application et cela est fait au moyen d'intentions pour ce que j'ai compris. – Bilthon

+0

Je ne sais pas vraiment ce que cela signifie, mais je viens de remarquer que je reçois cette ligne à logcat: 09-06 20: 08: 04.063: ERROR/C2DMRegistrar (169): [C2DMReg] handleRequest attrapé java.io.IOException: Échec de l'arrêt SSL: erreur d'E/S pendant l'appel système, tuyau rompu – Bilthon

+0

Hm. Intéressant. J'ai ajouté une autre chose que vous pouvez essayer à mon poste. –

3

Je viens de recevoir moi-même de travailler après avoir lutté avec elle pendant un certain temps.

Dans le manifeste, vous avez la ligne

<receiver android:name=".C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND"> 

Ce qui signifie que vous avez besoin d'une classe appelée C2DMReceiver qui s'étend C2DMBaseReceiver dans le paquet C2DM. Pour obtenir cette implémentation, j'ai copié le paquet c2dm et le fichier C2DMReceiver.java de l'exemple chrometophone-android dans mon projet et j'ai pu obtenir un identifiant d'enregistrement du serveur C2DM comme prévu.

2

J'ai eu le même problème. Ma solution consistait à déplacer toutes les autorisations dans mon manifeste au-dessus de la balise d'application.