Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I am developing the GCM sample app using http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifications/#comment-103785.

I am unable to register gcm server.I am getting the following error.I have goggled it .but i couldn't find the solution and all the solutions were about jar files i have done all the changes but i couldn't get it.

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)

And my class code follows

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

}

like image 485
Sanjeev Avatar asked Feb 12 '23 23:02

Sanjeev


1 Answers

Here, no need to import google_play_services_lib in your workspace, google_play_services_lib has a jar named google-play-services.jar which needs to be included in your GCM App.

google-play-services.jar contains all GCM related classes, thats why google_play_services_lib has been added as dependency on GCM Android Project. The simplest thing you can do is to add that jar on your GCM project instead of adding dependency of google_play_services_lib project.

To add jar in android project you have to do following things,
1. First create a libs folder under you project, its a libs folder and not lib.
2. Then copy google-play-services.jar inside libs folder.
3. Then right click on the google-play-services.jar and select Build Path > Add to Build Path.

You can see Android Private Libraries created under your project's root folder which will contain this jar.

Note: Path of jar file - sdk\extras\google\google_play_services\libproject\google-play-services_lib\libs

like image 189
DineshM Avatar answered Feb 20 '23 17:02

DineshM