android - java.lang.NoClassDefFoundError : com. 谷歌.android.gms.gcm.GoogleCloudMessaging

标签 android google-cloud-messaging

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

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

错误

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_libgoogle_play_services_lib 有一个名为 google-play-services.jar 的 jar,需要包含在您的 GCM 应用程序中。

google-play-services.jar 包含所有 GCM 相关类,这就是为什么 google_play_services_lib 被添加为对 GCM Android 项目的依赖。您可以做的最简单的事情是在您的 GCM 项目中添加该 jar,而不是添加 google_play_services_lib 项目的依赖项。

要在 android 项目中添加 jar,你必须执行以下操作,
1. 首先在你的项目下创建一个libs文件夹,它是一个libs文件夹,而不是lib
2. 然后将google-play-services.jar复制到libs文件夹中。
3. 然后右键点击 google-play-services.jar 并选择 Build Path > Add to Build Path

您可以看到在项目的根文件夹下创建的 Android 私有(private)库 将包含此 jar。

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

关于android - java.lang.NoClassDefFoundError : com. 谷歌.android.gms.gcm.GoogleCloudMessaging,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675699/

相关文章:

java - 我收到 GCM 错误 - MismatchedSenderID。

google-cloud-messaging - 每个项目的 Google Cloud PubSub 订阅限制

使用 GCM 的 Android 聊天应用

google-cloud-messaging - FCM授权总是失败

android - 使用 python 在 Google App Engine 上为 Android 推送消息实现 CCS

android - 我如何开始打包我的 Android 应用程序? [基维]

android - 将解析添加到 eclipse 库时遇到问题

android - 在android应用程序中显示html格式的文本

java - TextView 不能正常工作

java - 将 JSON 响应转换为二维字符串数组