Reputation: 103
Im following the tutorial here: http://developer.android.com/google/gcm/gs.html
I seem to have some issues registering my broadcastReceiver
I am getting the following error whenever the app runs, right after I register the device, and get the registration Id
java.lang.RuntimeException: Unable to instantiate receiver com.google.android.gcm.GCMBroadcastReceiver: java.lang.ClassNotFoundException: com.google.android.gcm.GCMBroadcastReceiver
Here is the full stackTrace:
06-19 01:08:03.994: E/AndroidRuntime(23867): FATAL EXCEPTION: main 06-19 01:08:03.994: E/AndroidRuntime(23867): java.lang.RuntimeException: Unable to instantiate receiver com.google.android.gcm.GCMBroadcastReceiver: java.lang.ClassNotFoundException: com.google.android.gcm.GCMBroadcastReceiver 06-19 01:08:03.994: E/AndroidRuntime(23867): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2111) 06-19 01:08:03.994: E/AndroidRuntime(23867): at android.app.ActivityThread.access$1500(ActivityThread.java:127) 06-19 01:08:03.994: E/AndroidRuntime(23867): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208) 06-19 01:08:03.994: E/AndroidRuntime(23867): at android.os.Handler.dispatchMessage(Handler.java:99) 06-19 01:08:03.994: E/AndroidRuntime(23867): at android.os.Looper.loop(Looper.java:137) 06-19 01:08:03.994: E/AndroidRuntime(23867): at android.app.ActivityThread.main(ActivityThread.java:4441) 06-19 01:08:03.994: E/AndroidRuntime(23867): at java.lang.reflect.Method.invokeNative(Native Method) 06-19 01:08:03.994: E/AndroidRuntime(23867): at java.lang.reflect.Method.invoke(Method.java:511) 06-19 01:08:03.994: E/AndroidRuntime(23867): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 06-19 01:08:03.994: E/AndroidRuntime(23867): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 06-19 01:08:03.994: E/AndroidRuntime(23867): at dalvik.system.NativeStart.main(Native Method) 06-19 01:08:03.994: E/AndroidRuntime(23867): Caused by: java.lang.ClassNotFoundException: com.google.android.gcm.GCMBroadcastReceiver 06-19 01:08:03.994: E/AndroidRuntime(23867): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61) 06-19 01:08:03.994: E/AndroidRuntime(23867): at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 06-19 01:08:03.994: E/AndroidRuntime(23867): at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 06-19 01:08:03.994: E/AndroidRuntime(23867): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2106)
Here is the full manifest, with some of the activities cut off
<?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>
My GCMBroadcastReceiver class
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());
}
}
Any ideas as to why Im not able to register the receiver? Thanks
Upvotes: 4
Views: 5203
Reputation: 292
Try to check the v.4 library. Propreties->Java Build Path->Order and Export
Upvotes: -1
Reputation: 393771
The app is looking for com.google.android.gcm.GCMBroadcastReceiver
, but your class is in a different package pushNotification.GCMBroadcastReceiver
.
And the package of your app is a different one - com.myAppName
.
While your GCMBroadcastReceiver
doesn't have to be in the same package as the package of your app, the category in the intent filter must be the package of the app.
You should change this :
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="pushNotification" />
</intent-filter>
To this :
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.myAppName" />
</intent-filter>
EDIT :
Based on your manifest, you have additional errors :
You specify the Broadcast Receiver twice. If you wish to use your own Receiver, you should remove this part :
<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>
Another problem :
Remove this line :
<uses-permission android:name="com.gotoohlala.gcm.permission.C2D_MESSAGE" />
Since you already have these lines (which are correct) :
<permission android:name="com.gotoohlala.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.gotoohlala.permission.C2D_MESSAGE" />
Upvotes: 5