Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google Cloud Messaging - GCM - SERVICE_NOT_AVAILABLE

Tags:

I am trying, to implement the new GCM, I am following Google get stated : http://developer.android.com/guide/google/gcm/gs.html

I getting stuck at getting my device registration ID !

My app keep trying to connect with Google server, Here my error logs :

onReceive: com.google.android.gcm.intent.RETRY GCM IntentService class: com.dombox.app.GCMIntentService Acquiring wakelock [GCMIntentService] start Registering app com.dombox.app of senders _my_sender_id_ Releasing wakelock onReceive: com.google.android.c2dm.intent.REGISTRATION GCM IntentService class: com.dombox.app.GCMIntentService Acquiring wakelock [GCMIntentService] start handleRegistration: registrationId = null, error = SERVICE_NOT_AVAILABLE, unregistered = null Registration error: SERVICE_NOT_AVAILABLE Scheduling registration retry, backoff = 912617 (768000) Releasing wakelock 

Here is my Activity Code, asking for an ID :

    try{         Log.i(TAG, "[checkNotifRegistration] checkDevice");         GCMRegistrar.checkDevice(this);         Log.i(TAG, "[checkNotifRegistration] checkManifest");         GCMRegistrar.checkManifest(this);         if (GCMRegistrar.isRegistered(this)) {             Log.i(TAG, "[checkNotifRegistration] reg id : "+GCMRegistrar.getRegistrationId(this));         }         final String regId = GCMRegistrar.getRegistrationId(this);         if (regId.equals("")) {             // SENDER_ID is my project id into google account url             GCMRegistrar.register(this, SENDER_ID);             Log.i(TAG, "[checkNotifRegistration] reg id : "+GCMRegistrar.getRegistrationId(this));         } else {             Log.i(TAG, "[checkNotifRegistration] already registered as : " + regId);         }     } catch(Exception e){         Log.e(TAG, "[checkNotifRegistration] Exception : "+e.getMessage());         e.printStackTrace();     } 

Here my Service code

public class GCMIntentService extends GCMBaseIntentService {  private static final String TAG = "GCMIntentService";  public GCMIntentService() {     super(SENDER_ID);            // SENDER_ID is my project id into google account url     // TODO Auto-generated constructor stub     Log.d(TAG, "[GCMIntentService] start"); }   public GCMIntentService(String senderId) {     super(senderId);     // TODO Auto-generated constructor stub     Log.d(TAG, "[GCMIntentService] start - sender Id : "+senderId); } } 

And here is my Android Manifest :

<permission android:name="com.dombox.app.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.dombox.app.permission.C2D_MESSAGE" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  <application     android:icon="@drawable/icon"     android:label="@string/app_name" >      <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.myapp.app" />         </intent-filter>     </receiver>  <service android:name=".GCMIntentService" android:enabled="true"/>      <activity         android:name=".activity.Myapp"         android:label="@string/app_name" >          <intent-filter>             <action android:name="android.intent.action.MAIN" />             <category android:name="android.intent.category.LAUNCHER" />         </intent-filter>      </activity> 

I'm following Google's instruction, but I stuck with this SERVICE_NOT_AVAILABLE error,

What am I doing wrong ?

like image 299
Thomas Besnehard Avatar asked Jul 09 '12 15:07

Thomas Besnehard


2 Answers

The problem was not code related, but link to the test phone. The test phone do not have a SIM, and the clock was not set. So google cannot resgistred it with a wrong time.

I manage to have a registration Id using a Android Virtual Device, with google api, and by setting the test phone clock.

like image 188
Thomas Besnehard Avatar answered Sep 19 '22 15:09

Thomas Besnehard


android:enabled="true"   

Remove this ^

If you don't already add this to your manifest

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" 

You don't need the second constructor in GCMIntentService. only this one

public GCMIntentService() {           super(SENDER_ID);  } 

Ensure that your SENDER_ID is the number copied out of the URL from your browser while you are browsing the google code website AND browsing the GCM service.

like image 43
Ryan Gray Avatar answered Sep 19 '22 15:09

Ryan Gray