Java.io.IOException: SERVICE_NOT_AVAILABLE im GCM-Client

Ich möchte einen gcm-Client in eine bestehende Android-App implementieren. Also, indem ich diesem Tutorial folge, schrieb ich folgenden 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> 

Gestern ging alles gut und ich konnte die Registrierungs-ID abrufen. Aber jetzt gibt es immer eine IOException , die SERVICE_NOT_AVAILABLE sagt.

Ich habe es auf meinem Samsung Galaxy S5 und im Genymotion Emulator (Android 4.1.2) getestet, aber ich bekomme immer die gleichen Ergebnisse. Hat jemand eine Idee, wie man das Problem lösen kann?

Bearbeiten

Hier ist die volle 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) 

5 Solutions collect form web for “Java.io.IOException: SERVICE_NOT_AVAILABLE im GCM-Client”

Überprüfen Sie die Zeit Ihres Geräts. Google kann Ihr Gerät nicht mit einer falschen Zeit registrieren

Als ich dieses Problem begegnete, was für mich gearbeitet wurde, war die Google Play-Anwendung zu öffnen.

Es scheint, dass es mindestens einmal gestartet werden muss, nachdem das Gerät vor jedem GCM-Registrierungsversuch neu gestartet wurde.

Das ist eine seltsame. Ich habe es gelöst, indem ich den GCM-Code an das Ende meiner onCreate () -Methode verschiebe.

Meine Vermutung ist die App Kontext wurde nicht vollständig erstellt, als ich versuchte, mich für CGM zu registrieren. Es braucht einen gültigen Kontext.

Gestern habe ich das Problem auf eigene Faust gelöst. Ich folgte der Demo-Anwendung und änderte die AsyncTask in der registerInBackground () – Methode zu einem einfachen Java-Thread. Hier ist der Code:

 private void registerInBackground() { final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0: Toast.makeText(context, getString(R.string.txt_gcm_registered), Toast.LENGTH_LONG).show(); break; case 1: Toast.makeText(context, getString(R.string.error_register_gcm), Toast.LENGTH_LONG).show(); break; } super.handleMessage(msg); } }; Runnable runnable = new Runnable() { @Override public void run() { try { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(context); } regId = gcm.register(Constants.SENDER_ID); if (sendRegistrationIdToBackend(regId)) { handler.sendEmptyMessage(0); } else { handler.sendEmptyMessage(1); } storeRegistrationId(context, regId); } catch (IOException ex) { handler.sendEmptyMessage(1); Log.e(LOG_TAG, ex.getMessage(), ex); } } }; new Thread(runnable).start(); } 

Jetzt funktioniert es, aber ich weiß nicht warum. Kann jemand den Grund erklären? Danke für Ihre Hilfe!

Wenn Sie Ihre App im Emulator ausführen, müssen Sie Google Play Service installieren.

Ich habe vor kurzem zu GenyMotion Emulator von Google native Emulator und begegnet diesem Fehler. Später habe ich realisiert GenyMotion Bild kommt nicht mit Google Play Service. Nach der Installation wurde das Problem gelöst.

Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.