Android google cloud messaging sample not working

2020-07-27 04:57发布

问题:

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.

回答1:

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.



回答2:

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.



回答3:

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)