2010-09-05 3 views
6

Sto provando a testare il framework C2DM. Ho ricevuto l'email di conferma un paio di giorni fa e ho provato a creare un client che potesse registrarsi. A tale scopo, ho creato un semplice client seguendo i passaggi descritti in questo tutorial: http://code.google.com/intl/es-419/android/c2dm/index.html.Problema di registrazione per C2DM in Android

Il file manifest di Android contiene tra le altre cose di questo codice:

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

E poi, l'attività principale lanciato all'avvio del programma ha il seguente codice:

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

Ho anche registrato un google account su AVD che esegue il mio client, come hanno detto che era richiesto. Ma il problema è che non riesco a "svegliare" il ricevitore della trasmissione. Non so cosa potrebbe essere sbagliato. Analizzando i log, posso vedere che l'intento di registrazione viene creato e apparentemente usato correttamente, ma il codice ricevente non viene mai eseguito, cosa potrebbe essere sbagliato?

Grazie in anticipo Nelson

risposta

9

Bene .. l'ho risolto, il problema era con la dichiarazione del destinatario. I tag per il ricevitore dovrebbero andare all'interno del tag dell'applicazione, come mostrato qui: http://developer.android.com/guide/topics/manifest/manifest-intro.html

Ecco un esempio di Manifest ben formato per un'applicazione C2DM. Grazie a Mark Murphy per aver pubblicato il link nel gruppo android-c2dm.

E scusa per lo stupido errore.

Nelson

1

cose che si possono verificare:

ho notato è che si dichiara un permesso C2DM ma non lo fai uso nella vostra applicazione in questo modo:

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

Se si dispone di uno sguardo alla biblioteca c2dm si vedrà che la helpe Il metodo register di r C2DMessaging crea l'intento con una chiamata aggiuntiva a setPackage.

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

Mi dispiace, devo aver commesso un errore durante la copia del testo qui, perché ho appena controllato il mio manifest e ha una riga come quella che si dice manca.E per la seconda parte della tua risposta devo dire che non sto nemmeno provando a inviare un messaggio. Sto solo provando a registrare l'applicazione e ciò avviene per mezzo di Intenti per quello che ho capito. – Bilthon

+0

Non so davvero cosa significhi, ma ho appena notato che ottengo questa riga al logcat: 09-06 20: 08: 04.063: ERRORE/C2DMRegistrar (169): [C2DMReg] handleRequest catturato java.io.IOException: Arresto SSL non riuscito: errore I/O durante la chiamata di sistema, pipe interrotta – Bilthon

+0

Hm. Interessante. Ho aggiunto un'altra cosa che puoi provare nel mio post. –

3

Ho appena ricevuto io stesso a lavorare dopo la lotta con esso per qualche tempo.

Nel manifesto, si ha la linea

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

Il che significa che hai bisogno di una classe chiamata C2DMReceiver che si estende C2DMBaseReceiver nel pacchetto C2DM. Per ottenere questo, ho copiato sia il pacchetto c2dm che il file C2DMReceiver.java dall'esempio chrometophone-android al mio progetto e sono riuscito a ottenere un ID di registrazione dal server C2DM come previsto.

2

Ho avuto lo stesso problema. La mia soluzione stava spostando tutte le autorizzazioni nel mio manifest sopra il tag dell'applicazione.