Im following the tutorial here http://developer.android.com/google/gcm/gs.html in order to setup GCM. Im currently in the process of trying to register the device. However, for some reason, the application always seems to crash at gcm = GoogleCloudMessaging.getInstance(this);
The stacktrace seems to point at the following: 06-18 13:42:20.909: I/dalvikvm(11613): Could not find method com.google.android.gms.gcm.GoogleCloudMessaging.getInstance, referenced from method pushNotification.PushNotification$1.run
Heres a sample of what I have so far
public PushNotification(Context c, Activity activity)
{
context = c;
this.activity = activity;
regid = getRegistrationId(context);
if (regid.length() == 0) {
Log.d("IN PUSHNOTIFICATION ","NOT REGISTERED. REGISTERING NOW.....");
registerBackground();
}
Log.d("IN PUSHNOTIFICATION ","REGISTRATION COMPLETE.....");
Log.d("IN PUSHNOTIFICATION ","REGISTRATION ID IS: " + regid);
gcm = GoogleCloudMessaging.getInstance(activity); //never reaches this code
}
private void registerBackground() {
Thread thread = new Thread(new Runnable()
{
public void run()
{
String msg = "";
try {
if (gcm == null) {
Log.d("IN PUSHNOTIFICATION", "IN BACKGROUND. gcm == NULL");
gcm = GoogleCloudMessaging.getInstance(context);
Log.d("IN PUSHNOTIFICATION", "IN BACKGROUND. AFTER gcm.GETINSTANCE");
}
Log.d("IN PUSHNOTIFICATION", "IN BACKGROUND. BEFORE gcm.register");
regid = gcm.register(SENDER_ID);
msg = "Device registered, registration id=" + regid;
Log.d("IN PUSHNOTIFICATION", "IN BACKGROUND. regid == " + regid);
// You should send the registration ID to your server over HTTP,
// so it can use GCM/HTTP or CCS to send messages to your app.
// For this demo: we don't need to send it because the device
// will send upstream messages to a server that echo back the message
// using the 'from' address in the message.
// Save the regid - no need to register again.
setRegistrationId(context, regid);
} catch (IOException ex) {
Log.d("IN PUSHNOTIFICATION", "IN BACKGROUND. EXCEPTION ERROR ERROR: ex = " + ex.getMessage());
msg = "Error :" + ex.getMessage();
}
}
}
);
thread.start();
}
Here is the full stacktrace
06-18 13:42:20.909: D/IN PUSHNOTIFICATION(11613): NOT REGISTERED. REGISTERING NOW..... 06-18 13:42:20.909: I/dalvikvm(11613): Could not find method com.google.android.gms.gcm.GoogleCloudMessaging.getInstance, referenced from method pushNotification.PushNotification$1.run 06-18 13:42:20.909: W/dalvikvm(11613): VFY: unable to resolve static method 5967: Lcom/google/android/gms/gcm/GoogleCloudMessaging;.getInstance (Landroid/content/Context;)Lcom/google/android/gms/gcm/GoogleCloudMessaging; 06-18 13:42:20.909: D/dalvikvm(11613): VFY: replacing opcode 0x71 at 0x0015 06-18 13:42:20.909: I/dalvikvm(11613): Could not find method com.google.android.gms.gcm.GoogleCloudMessaging.register, referenced from method pushNotification.PushNotification$1.run 06-18 13:42:20.909: W/dalvikvm(11613): VFY: unable to resolve virtual method 5969: Lcom/google/android/gms/gcm/GoogleCloudMessaging;.register ([Ljava/lang/String;)Ljava/lang/String; 06-18 13:42:20.909: D/dalvikvm(11613): VFY: replacing opcode 0x6e at 0x0039 06-18 13:42:20.909: D/IN PUSHNOTIFICATION(11613): REGISTRATION COMPLETE..... 06-18 13:42:20.909: D/IN PUSHNOTIFICATION(11613): REGISTRATION ID IS: 06-18 13:42:20.909: D/AndroidRuntime(11613): Shutting down VM 06-18 13:42:20.909: W/dalvikvm(11613): threadid=1: thread exiting with uncaught exception (group=0x2b542210) 06-18 13:42:20.909: D/IN PUSHNOTIFICATION(11613): IN BACKGROUND. gcm == NULL 06-18 13:42:20.909: W/dalvikvm(11613): threadid=20: thread exiting with uncaught exception (group=0x2b542210) 06-18 13:42:20.909: I/Process(11613): Sending signal. PID: 11613 SIG: 9 06-18 13:42:20.919: I/ActivityManager(278): Process com.gotoohlala (pid 11613) has died.
I solved the problem. Although I was linking to google-play-services_lib project, I also had to add the jar file, google-play-services_lib.jar into the project.
For the other people may get crazy for this bug like me. These following error mean the same thing:
Could not find method com.google.android.gms.gcm.GoogleCloudMessaging.getInstance java.lang.NoClasDefFound: .....GoogleCloudMessaging
The jar file for GoogleCloudMessaging class does not exported to the android runtime.
Because by default, Android builder does not export jar files frome the Android Private Library
You can double check by looking at the bin/dexedLibs
folder, if you still can not see the google-play-services-4064834317375a1fffbbc48c3994c697.jar
<-- that file is not exported to run time.
Solution:
Project Properties/Java Build Path/Order and Export/
check the Android Private Library
Now your all your jar files will come along to android device, and runtime error will no longer occur.
I am using the push notification through Microsoft Azure platform and faced the same problem.
I solved the problem by checking the 8 steps here: http://azure.microsoft.com/en-us/documentation/articles/mobile-services-android-get-started-push/#add-push
More precisely, the problem was that library google-play-services-lib
was not correctly added, even if I added the jar file (Steps 6 and 7)
来源:https://stackoverflow.com/questions/17175804/android-google-cloud-messaging-sample-not-working