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?
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)
Check the time of your device. Google cannot register your device with a wrong time
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With