Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fix Google Cloud Messaging Registration error: SERVICE_NOT_AVAILABLE?

I encountered a strange problem - I've been using GCM in my application for quite a long time and everything works perfectly. However, before a release to Google Play I changed my application package name from com.android.testapp to com.android.recognition and after this GCM stopped working. At first I got en error GCM sender id not set on constructor and fixed it by overriding getSenderIds(Context context), but now I can't get a registration ID. Here are the messages from logcat: enter image description here

How can I fix this? When I switched to a new package I changed everything in the manifest file to the new package:

<receiver         android:name="com.google.android.gcm.GCMBroadcastReceiver"         android:permission="com.google.android.c2dm.permission.SEND" >         <intent-filter>             <action android:name="com.google.android.c2dm.intent.RECEIVE" />             <action android:name="com.google.android.c2dm.intent.REGISTRATION" />             <category android:name="com.android.recognition" />         </intent-filter>     </receiver> 

So what is the problem behind this? Can renaming the application package cause this or is there another reason?

like image 466
MainstreamDeveloper00 Avatar asked Jun 19 '13 10:06

MainstreamDeveloper00


People also ask

What is a device GCM register error?

Getting "NotRegistered" error from GCM server means that registration_id which you try to use is not valid and should be removed.

How Google Cloud Messaging works?

The first step in GCM is that a third-party server (such as an email server) sends a request to Google's GCM server. This server then sends the message to your device, through that open connection. The Android system looks at the message to determine which app it's for, and starts that app.


2 Answers

The problem is answered, in my case it was little more complicated.

  1. Check you have an active internet connection
  2. Check that you have Internet permission in your manifest
  3. Make sure the package name is correct as Eran mentioned
  4. The device time is correctly setup. Even if everything is perfect, it will fail if device clock is not set correctly.

Wrong clock caused problem for me. :)

like image 69
Aman Gautam Avatar answered Sep 21 '22 19:09

Aman Gautam


This SERVICE_NOT_AVAILABLE error says that GCM Service is not available in current. Wait and try after some time.

This happens many time (As my experience), so don't worry about it.


See the GCMConstants class of GCM Lib.

/**      * The device can't read the response, or there was a 500/503 from the      * server that can be retried later. The application should use exponential      * back off and retry.      */     public static final String ERROR_SERVICE_NOT_AVAILABLE =             "SERVICE_NOT_AVAILABLE"; 

For more investigation see handleRegistration() of GCMBaseIntentService

private void handleRegistration(final Context context, Intent intent) {         String registrationId = intent.getStringExtra(EXTRA_REGISTRATION_ID);         String error = intent.getStringExtra(EXTRA_ERROR);         String unregistered = intent.getStringExtra(EXTRA_UNREGISTERED);         Log.d(TAG, "handleRegistration: registrationId = " + registrationId +                 ", error = " + error + ", unregistered = " + unregistered);          // registration succeeded         if (registrationId != null) {             GCMRegistrar.resetBackoff(context);             GCMRegistrar.setRegistrationId(context, registrationId);             onRegistered(context, registrationId);             return;         }          // unregistration succeeded         if (unregistered != null) {             // Remember we are unregistered             GCMRegistrar.resetBackoff(context);             String oldRegistrationId =                     GCMRegistrar.clearRegistrationId(context);             onUnregistered(context, oldRegistrationId);             return;         }          // last operation (registration or unregistration) returned an error;         Log.d(TAG, "Registration error: " + error);         // Registration failed         if (ERROR_SERVICE_NOT_AVAILABLE.equals(error)) {             boolean retry = onRecoverableError(context, error);             if (retry) {                 int backoffTimeMs = GCMRegistrar.getBackoff(context);                 int nextAttempt = backoffTimeMs / 2 +                         sRandom.nextInt(backoffTimeMs);                 Log.d(TAG, "Scheduling registration retry, backoff = " +                         nextAttempt + " (" + backoffTimeMs + ")");                 Intent retryIntent =                         new Intent(INTENT_FROM_GCM_LIBRARY_RETRY);                 retryIntent.putExtra(EXTRA_TOKEN, TOKEN);                 PendingIntent retryPendingIntent = PendingIntent                         .getBroadcast(context, 0, retryIntent, 0);                 AlarmManager am = (AlarmManager)                         context.getSystemService(Context.ALARM_SERVICE);                 am.set(AlarmManager.ELAPSED_REALTIME,                         SystemClock.elapsedRealtime() + nextAttempt,                         retryPendingIntent);                 // Next retry should wait longer.                 if (backoffTimeMs < MAX_BACKOFF_MS) {                   GCMRegistrar.setBackoff(context, backoffTimeMs * 2);                 }             } else {                 Log.d(TAG, "Not retrying failed operation");             }         } else {             // Unrecoverable error, notify app             onError(context, error);         }     } 
like image 34
Pankaj Kumar Avatar answered Sep 19 '22 19:09

Pankaj Kumar