2010-09-05 13 views
6

Estoy intentando probar el marco C2DM. Recibí el correo electrónico de confirmación hace un par de días y luego intenté crear un cliente que pudiera registrarse. Para ese propósito, creé un cliente simple siguiendo los pasos descritos en este tutorial: http://code.google.com/intl/es-419/android/c2dm/index.html.Problema que se registra para C2DM en Android

El archivo de manifiesto de Android contiene, entre otras cosas este código:

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

Y entonces, la actividad principal puesto en marcha cuando se inicia el programa tiene el siguiente código:

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

También registró un Google cuenta en el AVD que ejecuta mi cliente, ya que dijeron que era obligatorio. Pero el problema es que no puedo hacer que el receptor de transmisión se "despierte". No sé lo que podría estar mal. Al analizar los registros, puedo ver que el intento de registro se crea y aparentemente se usa correctamente, pero el código del receptor nunca se ejecuta, ¿qué podría estar mal?

Gracias de antemano Nelson

Respuesta

9

Bien ... acabo de resolverlo, el problema fue con la declaración del receptor. Las etiquetas para el receptor deben ir dentro de la etiqueta de la aplicación, tal como se demuestra aquí: http://developer.android.com/guide/topics/manifest/manifest-intro.html

Aquí hay un ejemplo de un Manifiesto bien formateado para una aplicación C2DM. Gracias a Mark Murphy por publicar el enlace en el grupo android-c2dm.

Y perdón por el error.

Nelson

1

cosas que puede comprobar:

me di cuenta es que se está declarando un permiso C2DM pero no hace uso en su aplicación, así:

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

Si usted tiene un vistazo a la biblioteca c2dm verá que el helpe El método C2DMessagingregister crea la intención con una llamada adicional al setPackage.

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

Lo siento, debo haber cometido un error al copiar el texto aquí, porque acabo de verificar mi manifiesto y TIENE una línea como la que dices que falta.Y para la segunda parte de su respuesta debo decir que ni siquiera estoy tratando de enviar un mensaje todavía. Solo intento registrar la aplicación y eso se hace por medio de Intenciones por lo que entendí. – Bilthon

+0

Realmente no sé lo que significa, pero acabo de notar que obtengo esta línea en logcat: 09-06 20: 08: 04.063: ERROR/C2DMRegistrar (169): [C2DMReg] handleRequest captado java.io.IOException: El cierre SSL falló: error de E/S durante la llamada al sistema, tubería rota – Bilthon

+0

Hm. Interesante. Agregué otra cosa que puedes probar para mi publicación. –

3

acabo de recibir este mismo trabajo después de luchar con él durante algún tiempo.

En el manifiesto, que tienen la línea

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

que significa que necesita una clase llamada C2DMReceiver que se extiende C2DMBaseReceiver en el paquete c2dm. Para implementar esto, copié tanto el paquete c2dm como el archivo C2DMReceiver.java del ejemplo chrometophone-android en mi proyecto y pude obtener un ID de registro del servidor C2DM como estaba previsto.

2

Tuve el mismo problema. Mi solución estaba moviendo todos los permisos en mi manifiesto arriba de la etiqueta de la aplicación.