安卓设备上的 GCM 和应用程序崩溃

Posted

技术标签:

【中文标题】安卓设备上的 GCM 和应用程序崩溃【英文标题】:GCM on android device and App crashes 【发布时间】:2014-01-24 08:59:35 【问题描述】:

构建一个将启用推送通知的应用程序。当我在真实设备上运行它时,应用程序在启动时崩溃让我向你们展示我的代码。 MainActivity.java

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.content.SharedPreferences;
import static com.my.app.CommonUtilities.SENDER_ID;
import android.util.Log;
import android.widget.TextView;
import com.google.android.gcm.GCMRegistrar;
import com.my.app.R;
    public class MainActivity extends Activity 
        private String TAG = "** pushAndroidActivity **";
        private TextView mDisplay;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
    checkNotNull(SENDER_ID, "SENDER_ID");
    GCMRegistrar.checkDevice(this);
    GCMRegistrar.checkManifest(this);
    setContentView(R.layout.activity_main);
    mDisplay = (TextView) findViewById(R.id.display);
    final String regId = GCMRegistrar.getRegistrationId(this);
    Log.i(TAG, "registration id =====  "+regId);
    if (regId.equals("")) 
    GCMRegistrar.register(this, SENDER_ID);
     else 
    Log.v(TAG, "Already registered");
    
    mDisplay.setText("ffffff"+regId);
    

在onCreate之外我有

private void checkNotNull(Object reference, String name) 
        if (reference == null) 
        throw new NullPointerException(
        getString(R.string.error_config, name));
        
        

        @Override
        protected void onPause() 
        super.onPause();
        GCMRegistrar.unregister(this);
        

但是当我在设备上编译并运行它时,甚至在加载 MainActivity 之前突然崩溃,让我在这里发布 LogCat。

FATAL EXCEPTION: main
java.lang.NoClassDefFoundError: com.google.android.gcm.GCMRegistrar
com.my.app.MainActivity.onCreate(MainActivity.java:28)
android.app.Activity.performCreate(Activity.java:5008)
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
android.app.ActivityThread.access$600(ActivityThread.java:130)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:137)
android.app.ActivityThread.main(ActivityThread.java:4745)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
dalvik.system.NativeStart.main(Native Method)

还有我的 Manifest.xml

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="com.my.app.permission.C2D_MESSAGE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
 <receiver android:name=".MyC2dmReceiver" android:permission="com.google.android.c2dm.permission.SEND">
          <intent-filter>
              <action android:name="com.google.android.c2dm.intent.RECEIVE" />
              <category android:name="com.my.app" />
          </intent-filter>
          <intent-filter>
              <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
              <category android:name="com.my.app" />
          </intent-filter>
      </receiver>

【问题讨论】:

你在使用图书馆项目吗?如果是,则必须确保它带有绿色标记。如果您使用的是 jar 文件,那么它必须在 libs 文件夹中。最后一切都很完美,然后清理您的项目并重建它。 看这里***.com/questions/11273938/… 检查:this、this、this 和 this。 是的,我的 gcm.jar 不在库中。如何将其复制到库中? 【参考方案1】:

这是因为找不到jar文件。看看下面的解决方案:

GCM : java.lang.noclassdeffounderror: com.google.android.gcm.GCMRegistrar

java.lang.NoClassDefFoundError: com.google.android.gcm.GCMRegistrar

GCM NoClassDefFoundError when checking device/manifest

【讨论】:

是的,我的 GCM.jar 不在库中,但我该怎么做呢?我试图复制但不能告诉我如何将它复制到我的 libs 文件夹中? 复制粘贴到 Eclipse 中! 哦,对不起。我这样做了,但仍然崩溃。 尝试在将 jar 粘贴到 libs 下后将其添加到您的类路径中!【参考方案2】:

从 logcat 输出中,很明显 Android 找不到 GCMRegistrar 类,该类要么在库项目中,要么在 GCM.jar 中。在 Android 项目中,您需要将 jar 文件放在 libs 文件夹中,然后它们将自动包含到您的类路径中。如果您使用 GCM.jar 库,则需要将其复制到 libs 文件夹下。如果 libs 文件夹不存在,您可以通过右键单击 project 来创建它。

【讨论】:

我将 gcm.jar 复制到我的 libs 文件夹中,并将其添加到构建路径,但应用程序仍然崩溃 请查看 Manifest 文件,如果我遗漏了什么,请告诉我。谢谢 This 文档详细解释了一切。它还包含this 客户端示例。您可以通过查看示例来检查您的清单和其他部分是否正确。 我检查过,一切看起来都很好。但应用仍然崩溃 我已经从谷歌下载并安装了这个例子,这个应用程序也是如此。意味着在开始之前就崩溃了!现在可能是什么原因?我的手机?还是别的什么?

以上是关于安卓设备上的 GCM 和应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

什么是 GCM 注册 ID?

安卓设备的 GCM 推送通知不适用于 MI 和乐视手机

安卓设备的 GCM 推送通知不适用于 MI 和乐视手机

android 2.3 上的推送通知崩溃。

某些设备中的 Android 通知问题

安卓应用、Android 8(.1)、90% 华为设备中的 ANR 和崩溃