java.io.IOException: SERVICE_NOT_AVAILABLE dans le client GCM
Je veux mettre en œuvre un gcm client dans une application android. Donc, en suivant cette tutoriel que j'ai écrit code suivant:
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>
Hier, tout a bien fonctionné et j'ai pu récupérer l'id d'enregistrement. Mais maintenant, il y a toujours un IOException
disant SERVICE_NOT_AVAILABLE
.
Je l'ai testé sur mon Samsung Galaxy S5 et dans l'Émulateur Genymotion (Android 4.1.2), mais j'obtiens toujours le même résultat. Quelqu'un a une idée de comment résoudre le problème?
Modifier
Voici la pleine 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)
source d'informationauteur Robin
Vous devez vous connecter pour publier un commentaire.
Vérifier l'heure de votre appareil. Google ne peut pas enregistrer votre appareil avec un mauvais moment
Quand j'ai rencontré ce problème ce qui a fonctionné pour moi a été l'ouverture de la page Google Play de l'application.
Il semble qu'il doit être lancé au moins une fois après le redémarrage de l'appareil avant toute GCM de la tentative d'enregistrement.
C'est une bizarre. Je l'ai résolu en déplaçant le GCM code à la fin de mon onCreate() de la méthode.
Ma conjecture est que le Contexte de l'application n'a pas été entièrement créé par le temps j'ai essayé de m'inscrire pour le CGM. Il a besoin d'un Contexte valide.
Hier, j'ai résolu le problème sur mon propre. J'ai suivi la démo de l'application et de l'AsyncTask dans le registerInBackground()-Méthode à un simple fil de java. Voici le code:
Maintenant, il est au travail, mais je ne sais pas pourquoi. Quelqu'un peut-il expliquer la raison? Merci pour votre aide!
Si vous exécutez votre application dans l'émulateur, vous devez installer Google Play Service.
J'ai récemment opté pour l'Émulateur GenyMotion de Google native de l'émulateur et rencontré cette erreur. Plus tard, j'ai réalisé GenyMotion image ne vient pas avec Google Play Services. Après l'installation, le problème est résolu.