Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.io.IOException: SERVICE_NOT_AVAILABLE in GCM Client

Tags:

I want to implement an gcm client into an existing android app. So, by following this tutorial I wrote following code:

public class RegisterForGCMAsyncTask extends AbstractSecureOperationTask {  ...  @Override protected Boolean doInBackground(String... params) {     String token = authenticate();     getRegId();     if (TextUtils.isEmpty(registrationId)) {         return false;     }     //     try {         URL url = convertToURLEscapingIllegalCharacters(String.format(Constants.REGISTER_URL,                 registrationId, userId, token));         URLConnection connection = url.openConnection();         InputStreamReader streamReader = new InputStreamReader(connection.getInputStream());         JSONParser parser = new JSONParser();         JSONObject rootObj = (JSONObject) parser.parse(streamReader);         String status = rootObj.get("status").toString();         if (status.equals("OK")) {             return true;         }     } catch (ParseException e) {         e.printStackTrace();     } catch (IOException e) {         e.printStackTrace();     }     return false; }  private void getRegId() {     try {         if (gcm == null) {             gcm = GoogleCloudMessaging.getInstance(context);         }         registrationId = gcm.register(PROJECT_ID);     } catch (IOException e) {         Log.e(LOG_TAG, e.getMessage(), e);     } } } 

AndroidMainfest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"       package="de.xxxxxxxx.xxxxxxxx"       android:versionCode="20140617"       android:versionName="2.0.0">  <uses-sdk         android:minSdkVersion="15"         android:targetSdkVersion="19"/>  <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.GET_ACCOUNTS"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>  <permission         android:name="de.xxxxxxxx.xxxxxxxx.permission.MAPS_RECEIVE"         android:protectionLevel="signature"/> <uses-permission android:name="de.xxxxxxxx.xxxxxxxx.permission.MAPS_RECEIVE"/>  <permission         android:name="de.xxxxxxxx.xxxxxxxx.permission.C2D_MESSAGE"         android:protectionLevel="signature"/> <uses-permission android:name="de.xxxxxxxx.xxxxxxxx.permission.C2D_MESSAGE"/>   <!-- Maps API needs OpenGL ES 2.0. --> <uses-feature         android:glEsVersion="0x00020000"         android:required="true"/>  <application         android:allowBackup="true"         android:icon="@drawable/ic_launcher"         android:label="@string/app_name"         android:theme="@style/AppTheme">      <activity             android:name="de.retterapps.Handyalarm.views.activities.MainActivity"             android:configChanges="orientation|screenLayout|screenSize|layoutDirection"             android:label="@string/app_name"             android:theme="@style/AppTheme">         <intent-filter>             <action android:name="android.intent.action.MAIN"/>              <category android:name="android.intent.category.LAUNCHER"/>         </intent-filter>     </activity>      <receiver             android:name=".helper.gcm.GcmBroadcastReceiver"             android:permission="com.google.android.c2dm.permission.SEND">         <intent-filter>             <action android:name="com.google.android.c2dm.intent.RECEIVE"/>             <category android:name="de.xxxxxxxx.xxxxxxxx"/>         </intent-filter>     </receiver>     <service android:name=".helper.gcm.GcmMessageHandler"/>      <meta-data             android:name="com.google.android.gms.version"             android:value="@integer/google_play_services_version"/>     <meta-data             android:name="com.google.android.maps.v2.API_KEY"             android:value="xxxxxxxx"/> </application> 

Yesterday everything worked fine and I could retrieve the registration id. But now, there's always an IOException saying SERVICE_NOT_AVAILABLE.

I tested it on my Samsung Galaxy S5 and in the Genymotion Emulator (Android 4.1.2), but I am getting always the same results. Has anyone an idea how to solve the problem?

Edit

Here's the full stacktrace:

java.io.IOException: SERVICE_NOT_AVAILABLE     at com.google.android.gms.gcm.GoogleCloudMessaging.register(Unknown Source)     at de.retterapps.Handyalarm.helper.tasks.RegisterForGCMAsyncTask.getRegId(RegisterForGCMAsyncTask.java:72)     at de.retterapps.Handyalarm.helper.tasks.RegisterForGCMAsyncTask.doInBackground(RegisterForGCMAsyncTask.java:43)     at de.retterapps.Handyalarm.helper.tasks.RegisterForGCMAsyncTask.doInBackground(RegisterForGCMAsyncTask.java:24)     at android.os.AsyncTask$2.call(AsyncTask.java:287)     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)     at java.util.concurrent.FutureTask.run(FutureTask.java:137)     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)     at java.lang.Thread.run(Thread.java:856) 
like image 610
Robin Avatar asked Jun 17 '14 12:06

Robin


2 Answers

Check the time of your device. Google cannot register your device with a wrong time

like image 184
Nickolai Astashonok Avatar answered Sep 22 '22 08:09

Nickolai Astashonok


When I encountered this issue what worked for me was to open the Google Play application.

It seems that it must be started at least once after the device restarts before any GCM registration attempt.

like image 28
Tom Susel Avatar answered Sep 18 '22 08:09

Tom Susel