Mensajería en la nube de Google, incapaz de inicializar el receptor

Im siguiendo el tutorial aquí: http://developer.android.com/google/gcm/gs.html

Parece que tengo algunos problemas para registrar mi broadcastReceiver

Estoy recibiendo el siguiente error cada vez que la aplicación se ejecuta, justo después de registrar el dispositivo, y obtener el registro de identificación

Java.lang.RuntimeException: No se puede instanciar el receptor com.google.android.gcm.GCMBroadcastReceiver: java.lang.ClassNotFoundException: com.google.android.gcm.GCMBroadcastReceiver

Aquí está el stacktrace completo:

06-19 01: 08: 03.994: E / AndroidRuntime (23867): FATAL EXCEPTION: principal 06-19 01: 08: 03.994: E / AndroidRuntime (23867): java.lang.RuntimeException: No se puede crear el receptor com.google. Android.gcm.GCMBroadcastReceiver: java.lang.ClassNotFoundException: com.google.android.gcm.GCMBroadcastReceiver 06-19 01: 08: 03.994: E / AndroidRuntime (23867): en android.app.ActivityThread.handleReceiver (ActivityThread.java: 2111) 06-19 01: 08: 03.994: E / AndroidRuntime (23867): en android.app.ActivityThread.access $ 1500 (ActivityThread.java:127) 06-19 01: 08: 03.994: E / AndroidRuntime (23867): En android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1208) 06-19 01: 08: 03.994: E / AndroidRuntime (23867): en android.os.Handler.dispatchMessage (Handler.java:99) 06- 19 01: 08: 03.994: E / AndroidRuntime (23867): en android.os.Looper.loop (Looper.java:137) 06-19 01: 08: 03.994: E / AndroidRuntime (23867): en android.app. ActivityThread.main (ActivityThread.java:4441) 06-19 01: 08: 03.994: E / AndroidRuntime (23867): en java.lang.reflect.M Ethod.invokeNative (Método nativo) 06-19 01: 08: 03.994: E / AndroidRuntime (23867): en java.lang.reflect.Method.invoke (Method.java:511) 06-19 01: 08: 03.994: E / AndroidRuntime (23867): en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:784) 06-19 01: 08: 03.994: E / AndroidRuntime (23867): en com.android.internal. Os.ZygoteInit.main (ZygoteInit.java:551) 06-19 01: 08: 03.994: E / AndroidRuntime (23867): en dalvik.system.NativeStart.main (Método nativo) 06-19 01: 08: 03.994: E / AndroidRuntime (23867): Causado por: java.lang.ClassNotFoundException: com.google.android.gcm.GCMBroadcastReceiver 06-19 01: 08: 03.994: E / AndroidRuntime (23867): en dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader .java: 61) 06-19 01: 08: 03.994: E / AndroidRuntime (23867): en java.lang.ClassLoader.loadClass (ClassLoader.java:501) 06-19 01: 08: 03.994: E / AndroidRuntime (23867 ): En java.lang.ClassLoader.loadClass (ClassLoader.java:461) 06-19 01: 08: 03.994: E / AndroidRuntime (23867): en android.app.ActivityThread.handle Receptor (ActivityThread.java:2106)

Aquí está el manifiesto completo, con algunas de las actividades cortadas

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.gotoohlala" android:versionCode="48" android:versionName="4.1.2" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="11" /> <uses-feature android:name="android.hardware.camera" /> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true" /> <application android:hardwareAccelerated="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <uses-library android:name="com.google.android.maps" /> <!-- Push notification --> <receiver android:name="pushNotification.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.gotoohlala" /> </intent-filter> </receiver> <!-- Push notification END --> <activity android:name="launchOohlala.LaunchOohlala" android:label="@string/app_name" android:theme="@android:style/Theme.Light.NoTitleBar" android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="launchOohlala.FakeLogin" android:label="@string/app_name" android:theme="@android:style/Theme.Light.NoTitleBar" android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name="launchOohlala.CheckEmail" android:label="@string/app_name" android:windowSoftInputMode="stateHidden|adjustResize" android:theme="@android:style/Theme.Light.NoTitleBar" android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name="discoverMyCampus.RulesFragment" android:label="@string/app_name" android:windowSoftInputMode="stateHidden|adjustResize" android:theme="@android:style/Theme.Light.NoTitleBar" android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.gotoohlala" /> </intent-filter> </receiver> <service android:name=".GCMIntentService" /> <activity android:name="com.facebook.LoginActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:label="@string/app_name" /> <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/applicationId" /> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyDP2zfbRiEH0mNCkn2lpxm92DQHsfIJfPU" /> </application> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.VIBRATE" /> <!-- Wifi related --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CALL_PHONE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="com.gotoohlala.gcm.permission.C2D_MESSAGE" /> <permission android:name="com.gotoohlala.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.gotoohlala.permission.C2D_MESSAGE" /> <!-- App receives GCM messages. --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <!-- GCM requires a Google account. --> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <!-- Keeps the processor from sleeping when a message is received. --> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-feature android:name="android.hardware.telephony" android:required="false" /> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <permission android:name="com.gotoohlala.permission.MAPS_RECEIVE" android:protectionLevel="signature"/> <uses-permission android:name="com.gotoohlala.permission.MAPS_RECEIVE"/> </manifest> 

Mi clase GCMBroadcastReceiver

 package pushNotification; import com.google.android.gms.gcm.GoogleCloudMessaging; import com.gotoohlala.OohlalaMain; import discoverMyCampus.RulesFragment; import android.app.Activity; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.support.v4.app.NotificationCompat; import android.util.Log; /** * Handling of GCM messages. */ public class GCMBroadcastReceiver extends BroadcastReceiver { static final String TAG = "GCMDemo"; public static final int NOTIFICATION_ID = 1; private NotificationManager mNotificationManager; NotificationCompat.Builder builder; Context ctx; @Override public void onReceive(Context context, Intent intent) { Log.d("SUCCESS SUCCESS", "ONRECEIVE HAS BEEN CALLED, WOOT WOOT!!"); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); Log.d("SUCCESS SUCCESS", "ONRECEIVE HAS BEEN CALLED, WOOT WOOT!!"); ctx = context; String messageType = gcm.getMessageType(intent); if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { sendNotification("Send error: " + intent.getExtras().toString()); } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { sendNotification("Deleted messages on server: " + intent.getExtras().toString()); } else { sendNotification("Received: " + intent.getExtras().toString()); } setResultCode(Activity.RESULT_OK); } // Put the GCM message into a notification and post it. private void sendNotification(String msg) { mNotificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, new Intent(ctx, RulesFragment.class), 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(ctx) .setContentTitle("GCM Notification") .setContentText(msg); mBuilder.setContentIntent(contentIntent); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.getNotification()); } } 

¿Alguna idea de por qué no puedo registrar el receptor? Gracias

La aplicación está buscando com.google.android.gcm.GCMBroadcastReceiver , pero su clase está en un paquete diferente pushNotification.GCMBroadcastReceiver .

Y el paquete de tu aplicación es diferente: com.myAppName .

Aunque su GCMBroadcastReceiver no tiene que estar en el mismo paquete que el paquete de su aplicación, la categoría en el filtro de intenciones debe ser el paquete de la aplicación.

Debe cambiar esto:

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

A esto :

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

EDIT:

Sobre la base de su manifiesto, tiene errores adicionales:

Especifique el receptor de difusión dos veces. Si desea utilizar su propio receptor, debe quitar esta parte:

  <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.gotoohlala" /> </intent-filter> </receiver> 

Otro problema :

Eliminar esta línea:

 <uses-permission android:name="com.gotoohlala.gcm.permission.C2D_MESSAGE" /> 

Ya que ya tiene estas líneas (que son correctas):

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

Trate de revisar la biblioteca v.4. Propreties-> Ruta de construcción de Java-> Pedido y Exportación

  • Notificación de empuje cuando se está ejecutando la aplicación
  • GCM - Rara vez recibiendo mensajes temáticos
  • Google Cloud Messaging - CCS (XMPP) vs servidor HTTP
  • Notificación de emisión de GCM Cordova no funciona cuando no se ejecuta la aplicación
  • Cómo obtener clave de API de GCM, no hay aplicaciones registradas en el menú
  • Reaccionar-Nativo Android PushNotifications
  • Android, enviar mensajes a 1000 dispositivos rápidamente
  • ¿Cómo mostrar la imagen en notificación push (Gcm) android?
  • Notificaciones push de Android con XMPP
  • Cómo analizar GCM responder a eliminar identificación de registro no válido del servidor con php
  • Error de autorización de GCM http 401
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.