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
- Android - No se puede iniciar el receptor com.parse.ParsePushBroadcastReceiver
- Notificaciones de usuarios - ¿Cómo recuperar un notification_id perdido de GCM?
- Programación de Android: GCMIntentService Stuck at WakeLock
- Push to talk con Android
- ¿Es posible establecer un color de fondo para el icono en el cajón de notificaciones en Android si se utiliza Parse Push?
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
- Notificación de empuje en Web móvil
- ¿Por qué obtengo "MismatchSenderId" desde el lado del servidor GCM?
- GCM cómo anular el registro de un dispositivo con GCM y servidor de terceros
- OUTDATED DEVICE: Notificación de Parse Push a dispositivos Android
- Android: abre o reinicia la aplicación después de hacer clic en la notificación push mediante las actividades de bandera
- Implementación de GCM con PHP siempre enfrentando error no autorizado 401
- Cordova Push Plugin: onNotificationGMC no se activa y no se puede obtener regID
- ¿Cómo podemos obtener un dispositivo de token para Android para notificación push?
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
- Cómo agregar acciones al menú Overflow en Galaxy S3?
- ¿Es necesario mantener las clases del mismo paquete en el mismo dex mientras se utilizan múltiples archivos dex