2

我按照这里的教程http://developer.android.com/google/gcm/gs.html来设置 GCM。我目前正在尝试注册设备。但是,由于某种原因,应用程序似乎总是在 gcm = GoogleCloudMessaging.getInstance(this); 处崩溃。

堆栈跟踪似乎指向以下内容:06-18 13:42:20.909: I/dalvikvm(11613): 找不到方法 com.google.android.gms.gcm.GoogleCloudMessaging.getInstance,引用自方法 pushNotification.PushNotification$1 。跑

这是我到目前为止所拥有的样本

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();
}

这是完整的堆栈跟踪

06-18 13:42:20.909:D/IN 推送通知(11613):未注册。现在注册..... 06-18 13:42:20.909: I/dalvikvm(11613): 找不到方法 com.google.android.gms.gcm.GoogleCloudMessaging.getInstance,引用自方法 pushNotification.PushNotification$1.run 06-18 13:42:20.909: W/dalvikvm(11613): VFY: 无法解析静态方法 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: 在 0x0015 处替换操作码 0x71 06-18 13:42:20.909: I/dalvikvm(11613): 找不到方法 com.google.android.gms .gcm.GoogleCloudMessaging.register,引用自方法 pushNotification.PushNotification$1.run 06-18 13:42:20.909:W/dalvikvm(11613):VFY:无法解析虚拟方法 5969:Lcom/google/android/gms/gcm/GoogleCloudMessaging;.register ([Ljava/lang/String;)Ljava/lang/String; 06-18 13:42:20.909: D/dalvikvm(11613): VFY: 在 0x0039 处替换操作码 0x6e 06-18 13:42:20.909: D/IN PUSHNOTIFICATION(11613): 注册完成..... 06-18 13:42:20.909:D/IN PUSHNOTIFICATION(11613):注册 ID 是:06-18 13:42:20.909:D/AndroidRuntime(11613):关闭 VM 06-18 13:42:20.909:W/dalvikvm( 11613):threadid = 1:线程以未捕获的异常退出(组= 0x2b542210)06-18 13:42:20.909:D / IN PUSHNOTIFICATION(11613):在后台。gcm == NULL 06-18 13:42:20.909: W/dalvikvm(11613): threadid=20: 线程以未捕获的异常退出 (group=0x2b542210) 06-18 13:42:20.909: I/Process(11613):发送信号。PID:11613 SIG:9 06-18 13:42:20.919:I/ActivityManager(278):进程 com。

4

3 回答 3

4

我解决了这个问题。虽然我链接到 google-play-services_lib 项目,但我还必须将 jar 文件 google-play-services_lib.jar 添加到项目中。

于 2013-06-19T05:29:37.410 回答
1

因为其他人可能会像我一样为这个错误而疯狂。以下这些错误意味着同样的事情:

找不到方法 com.google.android.gms.gcm.GoogleCloudMessaging.getInstance java.lang.NoClasDefFound: .....GoogleCloudMessaging

GoogleCloudMessaging 类的 jar 文件不会导出到 android 运行时。

因为默认情况下,Android builder 不会从Android Private Library

您可以通过查看bin/dexedLibs文件夹来仔细检查,如果您仍然看不到google-play-services-4064834317375a1fffbbc48c3994c697.jar <-- 该文件未导出到运行时。

解决方案: Project Properties/Java Build Path/Order and Export/ 勾选“Android Private Library 现在你所有的 jar 文件都将出现在 android 设备上,并且不再出现运行时错误”。

于 2013-06-25T17:52:54.113 回答
0

我正在通过 Microsoft Azure 平台使用推送通知,并遇到了同样的问题。

我通过检查这里的 8 个步骤解决了这个问题:http: //azure.microsoft.com/en-us/documentation/articles/mobile-services-android-get-started-push/#add-push

更准确地说,问题是google-play-services-lib没有正确添加库,即使我添加了 jar 文件(步骤 6 和 7)

于 2014-05-07T00:05:25.297 回答