6
private void registerClient() {
    try {
        GCMRegistrar.checkDevice(this);
        GCMRegistrar.checkManifest(this);
        regId = GCMRegistrar.getRegistrationId(this);
        if (regId.equals("")) {
            registrationStatus = "Registering...";
            GCMRegistrar.register(this, "1074338555805");
            regId = GCMRegistrar.getRegistrationId(this);
            registrationStatus = "Registration Acquired";
            sendRegistrationToServer();
        } else {
            registrationStatus = "Already registered";
        }
    } catch (Exception e) {
        e.printStackTrace();
        registrationStatus = e.getMessage();
    }
}

registration id is null from gcm in android 2.3.3, 2.3.5 but it is not null and working in android 2.3.4, 4.0.4.

nurealam11
  • 537
  • 4
  • 16
Raj
  • 905
  • 1
  • 8
  • 17
  • 1
    Does this help? http://stackoverflow.com/questions/11713363/i-can-not-get-registration-id-from-android-gcm – trojanfoe Jan 11 '13 at 08:13
  • 1
    The top answer in @trojanfoe's comment contains your solution. `GCMRegistrar.register` is asynchronous and so calling `getRegistrationId` immediately after is unreliable. Handle the broadcast that Google Services sends you with the id. – tophyr Jul 01 '14 at 16:42

1 Answers1

0

As quite clearly stated on the Google Play Services set-up guide.

https://developer.android.com/google/gcm/client.html

Application OnCreate:

    // Check device for Play Services APK. If check succeeds, proceed with
    //  GCM registration.
    if (checkPlayServices()) {
        gcm = GoogleCloudMessaging.getInstance(this);
        regid = getRegistrationId(context);

        if (regid.isEmpty()) {
            registerInBackground();
        }
    } else {
        Log.i(TAG, "No valid Google Play Services APK found.");
    }

Register in background code:

/**
 * Registers the application with GCM servers asynchronously.
 * <p>
 * Stores the registration ID and app versionCode in the application's
 * shared preferences.
 */
private void registerInBackground() {
  new AsyncTask() {
    @Override
    protected String doInBackground(Void... params) {
        String msg = "";
        try {
            if (gcm == null) {
                gcm = GoogleCloudMessaging.getInstance(context);
            }
            regid = gcm.register(SENDER_ID);
            msg = "Device registered, registration ID=" + 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.
            // The request to your server should be authenticated if your app
            // is using accounts.
            sendRegistrationIdToBackend();

            // 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.

            // Persist the regID - no need to register again.
            storeRegistrationId(context, regid);
        } catch (IOException ex) {
            msg = "Error :" + ex.getMessage();
            // If there is an error, don't just keep trying to register.
            // Require the user to click a button again, or perform
            // exponential back-off.
        }
        return msg;
    }

    @Override
    protected void onPostExecute(String msg) {
        mDisplay.append(msg + "\n");
    }
  }.execute(null, null, null);
  ...
}
Chris.Jenkins
  • 13,051
  • 4
  • 60
  • 61