java.lang.NoClassDefFoundError:com.google.android.gms.gcm.GoogleCloudMessaging

2023-12-12

我正在使用开发 GCM 示例应用程序http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifications/#comment-103785.

我无法注册 gcm 服务器。我收到以下错误。我仔细检查了它。但我找不到解决方案,所有解决方案都是关于 jar 文件的,我已经完成了所有更改,但我无法得到它。

Error

FATAL EXCEPTION: main
    java.lang.NoClassDefFoundError: com.google.android.gms.gcm.GoogleCloudMessaging
    com.sanjeev.integrationapp.RegisterActivity.registerGCM(RegisterActivity.java:80)
    com.sanjeev.integrationapp.RegisterActivity$1.onClick(RegisterActivity.java:47)

    at android.view.View.performClick(View.java:4084)

    at android.view.View$PerformClick.run(View.java:16966)

    at android.os.Handler.handleCallback(Handler.java:615)

    at android.os.Handler.dispatchMessage(Handler.java:92)

    at android.os.Looper.loop(Looper.java:137)

    at android.app.ActivityThread.main(ActivityThread.java:4745)

    at java.lang.reflect.Method.invokeNative(Native Method)

    at java.lang.reflect.Method.invoke(Method.java:511)

    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)

    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)

    at dalvik.system.NativeStart.main(Native Method)

我的班级代码如下

public class RegisterActivity extends Activity {

    Button btnGCMRegister;
    Button btnAppShare;
    GoogleCloudMessaging gcm;
    Context context;
    String regId;

    public static final String REG_ID = "regId";
    private static final String APP_VERSION = "appVersion";

    static final String TAG = "Register Activity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);

    context = getApplicationContext();

    btnGCMRegister = (Button) findViewById(R.id.btnGCMRegister);
    btnGCMRegister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            if (TextUtils.isEmpty(regId)) {
                regId = registerGCM();
                Log.d("RegisterActivity", "GCM RegId: " + regId);
            } else {
        Toast.makeText(getApplicationContext(),
            "Already Registered with GCM Server!",
                        Toast.LENGTH_LONG).show();
            }
        }
    });

    btnAppShare = (Button) findViewById(R.id.btnAppShare);
    btnAppShare.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            if (TextUtils.isEmpty(regId)) {
        Toast.makeText(getApplicationContext(), "RegId is empty!",
                        Toast.LENGTH_LONG).show();
            } else {
                Intent i = new Intent(getApplicationContext(),
                        MainActivity.class);
                i.putExtra("regId", regId);
                Log.d("RegisterActivity",
            "onClick of Share: Before starting main activity.");
                startActivity(i);
                finish();
    Log.d("RegisterActivity", "onClick of Share: After finish.");
            }
        }
    });
}

public String registerGCM() {

 // below line I am getting error 

gcm = GoogleCloudMessaging.getInstance(this);




    regId = getRegistrationId(context);

    if (TextUtils.isEmpty(regId)) {

        registerInBackground();

    Log.d("RegisterActivity",
    "registerGCM - successfully registered with GCM server - regId: "
                        + regId);
    } else {
        Toast.makeText(getApplicationContext(),
                "RegId already available. RegId: " + regId,
                Toast.LENGTH_LONG).show();
    }
    return regId;
}

@SuppressLint("NewApi")
private String getRegistrationId(Context context) {
    final SharedPreferences prefs = getSharedPreferences(
            MainActivity.class.getSimpleName(), Context.MODE_PRIVATE);
    String registrationId = prefs.getString(REG_ID, "");
    if (registrationId.isEmpty()) {
        Log.i(TAG, "Registration not found.");
        return "";
    }
    int registeredVersion = prefs.getInt(APP_VERSION, Integer.MIN_VALUE);
    int currentVersion = getAppVersion(context);
    if (registeredVersion != currentVersion) {
        Log.i(TAG, "App version changed.");
        return "";
    }
    return registrationId;
}

private static int getAppVersion(Context context) {
    try {
        PackageInfo packageInfo = context.getPackageManager()
                .getPackageInfo(context.getPackageName(), 0);
        return packageInfo.versionCode;
    } catch (NameNotFoundException e) {
Log.d("RegisterActivity","I never expected this! Going down, going down!" + e);
        throw new RuntimeException(e);
    }
}

private void registerInBackground() {
    new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... params) {
            String msg = "";
            try {
                if (gcm == null) {
                gcm = GoogleCloudMessaging.getInstance(context);
                }
        regId = gcm.register(Config.GOOGLE_PROJECT_ID);
        Log.d("RegisterActivity", "registerInBackground - regId: "
                        + regId);
        msg = "Device registered, registration ID=" + regId;

                storeRegistrationId(context, regId);
            } catch (IOException ex) {
                msg = "Error :" + ex.getMessage();
                Log.d("RegisterActivity", "Error: " + msg);
            }
            Log.d("RegisterActivity", "AsyncTask completed: " + msg);
            return msg;
        }

        @Override
        protected void onPostExecute(String msg) {
             Toast.makeText(getApplicationContext(),
                    "Registered with GCM Server." + msg, 

                   Toast.LENGTH_LONG)
                    .show();
        }
    }.execute(null, null, null);
}

private void storeRegistrationId(Context context, String regId) {
    final SharedPreferences prefs = getSharedPreferences(
            MainActivity.class.getSimpleName(), Context.MODE_PRIVATE);
    int appVersion = getAppVersion(context);
    Log.i(TAG, "Saving regId on app version " + appVersion);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(REG_ID, regId);
    editor.putInt(APP_VERSION, appVersion);
    editor.commit();
} 

}


这里不需要导入google_play_services_lib在您的工作空间中,google_play_services_lib有一个名为谷歌播放服务.jar需要包含在您的 GCM 应用程序中。

谷歌播放服务.jar包含所有 GCM 相关类,这就是为什么google_play_services_lib已添加为 GCM Android 项目的依赖项。您可以做的最简单的事情就是将该 jar 添加到您的 GCM 项目中,而不是添加依赖项google_play_services_lib项目。

要在 android 项目中添加 jar,您必须执行以下操作,
1.首先创建一个libs您项目下的文件夹,它是libs文件夹而不是lib.
2.然后复制谷歌播放服务.jar inside libs folder.
3.然后右键单击谷歌播放服务.jar并选择构建路径 > 添加到构建路径.

你可以看到Android 私有库在项目的根文件夹下创建,其中将包含此 jar。

注意:jar文件的路径 -sdk\extras\google\google_play_services\libproject\google-play-services_lib\libs

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.lang.NoClassDefFoundError:com.google.android.gms.gcm.GoogleCloudMessaging 的相关文章

随机推荐

  • 在运行时修改 Spring Security 配置

    我正在使用最新的 Spring Boot Spring Boot Starter Security 来构建简单的代理应用程序 目标是使用单一路由 方法启动应用程序 RequestMapping value api register meth
  • 在文本框控件内添加标签

    我想创建一个继承自 TextBox 的控件 其中有一个标签 其中 粘贴 到文本框的右侧 并且该文本不可由用户编辑 而是由属性设置 如何才能做到这一点 我意识到可能有很多原因导致这种用户体验是一个坏主意 但我必须这样做 改编自汉斯 帕桑特的w
  • 使用“月-年”日期值创建带有时间线的 D3.js 散点图

    我有一个列出日期的数据集 如下所示 var dataset 1 2006 20 3 2009 90 11 2004 50 5 2012 33 4 2008 95 4 2004 12 7 2000 44 5 2006 67 6 2007 21
  • POSIX 相当于 boost::thread::hardware_concurrency [重复]

    这个问题在这里已经有答案了 可能的重复 以编程方式查找机器上的核心数 用于确定系统在不超额订阅的情况下可以运行的最大线程数的 POSIX 或 x86 x86 64 特定系统调用是什么 谢谢 它使用 C 兼容的结构 那么为什么不直接使用实际的
  • Magento 模块在本地主机上运行良好,但在实时服务器上运行不佳

    我这里有一个奇怪的案例 I m making a simple magento module right now Some kind of script injection module similar to google analytic
  • 使用 UML 进行 C 编程

    我正在开发一个基于标准规范的嵌入式软件 该软件很大 在开始编码之前我需要设计我的软件 UML是一种面向对象的语言 可能是一个解决方案 但我不知道如何将它用于C软件 有没有任何文档可以帮助使用 UML 进行 C 编程 或者还有其他的c软件设计
  • 使用 cookie 保留整个网站的样式表偏好

    我有一个简单的 JavaScript 函数 它允许我在网站的每个页面中的不同样式表之间进行交换 目前 我的网站上没有实施任何 cookie 因此每当我进入新页面时 都会加载默认样式表 如果用户想要使用备用样式表 他们将被迫再次交换 我想通过
  • ios 中键盘显示方向错误

    我有一个viewcontroller在支持横向和纵向方向的应用程序中 单击按钮后 会出现一个弹出窗口 我应该在其中输入名称 在纵向模式下一切正常 但是 如果我关闭键盘 向左或向右旋转设备 然后打开弹出窗口 键盘仍会以纵向模式打开 I ve
  • 在c#中读取原始图像文件

    如何在未安装编解码器的情况下解码 打开 CR2 或 NEF 和 ARW 等原始图像文件 例如 lightroom 打开原始文件 我的代码如下所示 if fe CR2 fe NEF fe ARW BitmapDecoder bmpDec Bi
  • Xamarin MonoAndroid 设备管理

    我正在使用 Visual Studio 2017 来开发 Android 单视图应用程序 该应用程序应该是一个信息亭应用程序 我的目标是 API 21 在 Visual Studio AVD 设备 提供的模拟器上 我遇到的问题是我似乎无法制
  • 在 Joda 中将 UTC 转换为 LocalDateTime?

    DateTime dt new DateTime 2014 09 15T21 20 14 System out println dt System out println dt plusMillis 581042272 toDateTime
  • Android - 将下一个和上一个按钮添加到软键盘,该按钮在我的活动中单击编辑文本时出现

    我需要将 下一个 和 上一个 按钮添加到我的软键盘上 该键盘在单击活动页面中的编辑文本字段时出现 请为我提供有关实现此概念的教程的指导 提前致谢 您可以通过以下方式在 xml 中执行此操作 android imeOptions action
  • 如何在 WCF 客户端中提供用户名和客户端证书(为什么此示例有效)?

    考虑一个 WCF 服务 其目的是让传输层需要客户端证书 客户端证书在 IIS 中设置为 必需 同样 消息层也会有用户名认证 现在我已经看到这个问题了 禁止 WCF 客户端证书和用户名凭据 我可以在某种程度上理解那里发生的事情 并意识到 WC
  • Serilog HTTP接收器+Logstash:将Serilog消息数组拆分为单独的日志事件

    我们正在使用Serilog HTTP 接收器将消息发送到 Logstash 但是HTTP消息体是这样的 events Timestamp 2016 11 03T00 09 11 4899425 01 00 Level Debug Messa
  • 文件对象的初始化

    我想问一下java中初始化的格式 我目前所知道的是 int a 1 double b 1 0 String c java etc 现在 在主类中我想初始化一个File 我不知道该怎么做 首先 文件是一种对象类型 与原始类型 int 和 do
  • Windows Phone 7 中的网格

    我有一个网格视图代码 下面有分为3列 但我的代码有一个问题 什么时候多重数据被检索到 第 3 列中的所有数据都是重叠的 我如何修改下面的代码 例如它会在下面依次显示 Define grid column size Grid schedule
  • sqlite3 中的列详细信息

    在 SQLITE 数据库中 如果我需要表元详细信息 我可以运行以下命令 C sqlite gt sqlite3 exe sqlite2 db SQLite version 3 7 15 2012 12 12 13 36 53 Enter h
  • 使用最多两位小数的 double

    我想使用双精度 最多只有小数点后两位 即 它将存储最多 2 个小数位 如果比较两个 double 值 则比较应仅基于前 2 个小数位 如何实现这样的事情呢 我的意思是存储 比较 一切都将仅基于小数点后两位 剩下的地方可能不同 大于 小于 无
  • 获取小数点后十二位的纬度和经度

    我有一个应用程序 我必须从纬度和经度获取用户的当前位置 对于这两个值 我必须得到小数点后 12 位 这是用于获取用户位置的 GPS 跟踪器类 public class GPSTracker extends Service implement
  • java.lang.NoClassDefFoundError:com.google.android.gms.gcm.GoogleCloudMessaging

    我正在使用开发 GCM 示例应用程序http javapapers com android google cloud messaging gcm for android and push notifications comment 1037