Les problèmes de mise en œuvre de la nouvelle GCM Client pour Android
Je suis en train de mettre en œuvre la nouvelle GCM Client
sur Android en suivant les directives de Google (https://developers.google.com/cloud-messaging/android/client).
Je reçois légèrement différentes erreurs pour les deux périphériques différents. J'ai remarqué que je reçois NoSuchMethodError pour la méthode getNoBackupFilesDir pour les deux dispositifs.
C'est le logcat pour un Androïde 4.2.2:
06-08 09:01:09.920: I/dalvikvm(9138): Could not find methodandroid.app.Notification$Builder.setLocalOnly, referenced from method com.google.android.gms.common.GooglePlayServicesUtil.zza
06-08 09:01:09.920: W/dalvikvm(9138): VFY: unable to resolve virtual method 273: Landroid/app/Notification$Builder;.setLocalOnly (Z)Landroid/app/Notification$Builder;
06-08 09:01:09.920: D/dalvikvm(9138): VFY: replacing opcode 0x6e at 0x00c2
06-08 09:01:09.920: I/dalvikvm(9138): DexOpt: access denied from Lcom/google/android/gms/common/GooglePlayServicesUtil; to field Landroid/app/Notification;.extras
06-08 09:01:09.920: W/dalvikvm(9138): VFY: unable to resolve instance field 12
06-08 09:01:09.920: D/dalvikvm(9138): VFY: replacing opcode 0x54 at 0x00e1
06-08 09:01:09.920: E/dalvikvm(9138): Could not find class 'android.app.AppOpsManager', referenced from method com.google.android.gms.common.GooglePlayServicesUtil.zza
06-08 09:01:09.920: W/dalvikvm(9138): VFY: unable to resolve check-cast 25 (Landroid/app/AppOpsManager;) in Lcom/google/android/gms/common/GooglePlayServicesUtil;
06-08 09:01:09.920: D/dalvikvm(9138): VFY: replacing opcode 0x1f at 0x000e
06-08 09:01:09.920: I/dalvikvm(9138): Could not find method android.content.pm.PackageManager.getPackageInstaller, referenced from method com.google.android.gms.common.GooglePlayServicesUtil.zzh
06-08 09:01:09.920: W/dalvikvm(9138): VFY: unable to resolve virtual method 528: Landroid/content/pm/PackageManager;.getPackageInstaller ()Landroid/content/pm/PackageInstaller;
06-08 09:01:09.920: D/dalvikvm(9138): VFY: replacing opcode 0x6e at 0x000b
06-08 09:01:09.950: I/dalvikvm(9138): Could not find method android.support.v4.content.ContextCompat.getNoBackupFilesDir, referenced from method com.google.android.gms.iid.zzd.zzde
06-08 09:01:09.950: W/dalvikvm(9138): VFY: unable to resolve virtual method 2080: Landroid/support/v4/content/ContextCompat;.getNoBackupFilesDir (Landroid/content/Context;)Ljava/io/File;
06-08 09:01:09.950: D/dalvikvm(9138): VFY: replacing opcode 0x6e at 0x0007
06-08 09:01:09.950: W/dalvikvm(9138): threadid=11: thread exiting with uncaught exception (group=0x4174c930)
06-08 09:01:09.960: E/AndroidRuntime(9138): FATAL EXCEPTION: AsyncTask #1
06-08 09:01:09.960: E/AndroidRuntime(9138): java.lang.RuntimeException: An error occured while executing doInBackground()
06-08 09:01:09.960: E/AndroidRuntime(9138): at android.os.AsyncTask$3.done(AsyncTask.java:299)
06-08 09:01:09.960: E/AndroidRuntime(9138): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
06-08 09:01:09.960: E/AndroidRuntime(9138): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
06-08 09:01:09.960: E/AndroidRuntime(9138): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
06-08 09:01:09.960: E/AndroidRuntime(9138): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-08 09:01:09.960: E/AndroidRuntime(9138): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
06-08 09:01:09.960: E/AndroidRuntime(9138): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
06-08 09:01:09.960: E/AndroidRuntime(9138): at java.lang.Thread.run(Thread.java:856)
06-08 09:01:09.960: E/AndroidRuntime(9138): Caused by: java.lang.NoSuchMethodError: android.support.v4.content.ContextCompat.getNoBackupFilesDir
06-08 09:01:09.960: E/AndroidRuntime(9138): at com.google.android.gms.iid.zzd.zzde(Unknown Source)
06-08 09:01:09.960: E/AndroidRuntime(9138): at com.google.android.gms.iid.zzd.<init>(Unknown Source)
06-08 09:01:09.960: E/AndroidRuntime(9138): at com.google.android.gms.iid.zzd.<init>(Unknown Source)
06-08 09:01:09.960: E/AndroidRuntime(9138): at com.google.android.gms.iid.InstanceID.zza(Unknown Source)
06-08 09:01:09.960: E/AndroidRuntime(9138): at com.google.android.gms.iid.InstanceID.getInstance(Unknown Source)
06-08 09:01:09.960: E/AndroidRuntime(9138): at com.example.MainActivity$1.doInBackground(MainActivity.java:113)
06-08 09:01:09.960: E/AndroidRuntime(9138): at com.example.MainActivity$1.doInBackground(MainActivity.java:1)
06-08 09:01:09.960: E/AndroidRuntime(9138): at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-08 09:01:09.960: E/AndroidRuntime(9138): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
06-08 09:01:09.960: E/AndroidRuntime(9138): ... 4 more
Et c'est le logcat pour Android 5.1.1:
06-08 09:06:49.786: E/AndroidRuntime(2852): FATAL EXCEPTION: AsyncTask #1
06-08 09:06:49.786: E/AndroidRuntime(2852): Process: com.example, PID: 2852
06-08 09:06:49.786: E/AndroidRuntime(2852): java.lang.RuntimeException: An error occured while executing doInBackground()
06-08 09:06:49.786: E/AndroidRuntime(2852): at android.os.AsyncTask$3.done(AsyncTask.java:304)
06-08 09:06:49.786: E/AndroidRuntime(2852): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
06-08 09:06:49.786: E/AndroidRuntime(2852): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
06-08 09:06:49.786: E/AndroidRuntime(2852): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
06-08 09:06:49.786: E/AndroidRuntime(2852): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
06-08 09:06:49.786: E/AndroidRuntime(2852): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
06-08 09:06:49.786: E/AndroidRuntime(2852): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
06-08 09:06:49.786: E/AndroidRuntime(2852): at java.lang.Thread.run(Thread.java:818)
06-08 09:06:49.786: E/AndroidRuntime(2852): Caused by: java.lang.NoSuchMethodError: No virtual method getNoBackupFilesDir(Landroid/content/Context;)Ljava/io/File; in class Landroid/support/v4/content/ContextCompat; or its super classes (declaration of 'android.support.v4.content.ContextCompat' appears in /data/app/com.example-1/base.apk)
06-08 09:06:49.786: E/AndroidRuntime(2852): at com.google.android.gms.iid.zzd.zzde(Unknown Source)
06-08 09:06:49.786: E/AndroidRuntime(2852): at com.google.android.gms.iid.zzd.<init>(Unknown Source)
06-08 09:06:49.786: E/AndroidRuntime(2852): at com.google.android.gms.iid.zzd.<init>(Unknown Source)
06-08 09:06:49.786: E/AndroidRuntime(2852): at com.google.android.gms.iid.InstanceID.zza(Unknown Source)
06-08 09:06:49.786: E/AndroidRuntime(2852): at com.google.android.gms.iid.InstanceID.getInstance(Unknown Source)
06-08 09:06:49.786: E/AndroidRuntime(2852): at it.abgsys.htms.MainActivity$1.doInBackground(MainActivity.java:113)
06-08 09:06:49.786: E/AndroidRuntime(2852): at it.abgsys.htms.MainActivity$1.doInBackground(MainActivity.java:1)
06-08 09:06:49.786: E/AndroidRuntime(2852): at android.os.AsyncTask$2.call(AsyncTask.java:292)
06-08 09:06:49.786: E/AndroidRuntime(2852): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
06-08 09:06:49.786: E/AndroidRuntime(2852): ... 4 more
À la ligne 113 j'ai ceci:
InstanceID instanceID = InstanceID.getInstance(applicationContext);
Utilisé ici:
//AsyncTask to register Device in GCM Server
private void registerInBackground() {
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
String msg = "";
InstanceID instanceID = InstanceID.getInstance(applicationContext);
try {
regId = instanceID.getToken(GCM_SENDER_ID,
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
} catch (IOException e) {
e.printStackTrace();
}
return msg;
}
@Override
protected void onPostExecute(String msg) {
if (!TextUtils.isEmpty(regId)) {
Toast.makeText(
applicationContext,
"Registered with GCM Server successfully.\n\n"
+ msg, Toast.LENGTH_SHORT).show();
Log.e(TAG, "Registered with GCM Server successfully. RegID: " + regId);
} else {
Toast.makeText(
applicationContext,
"Reg ID Creation Failed.\n\nEither you haven't enabled Internet or GCM server is busy right now. "
+ "Make sure you enabled Internet and try registering again after some time."
+ msg, Toast.LENGTH_LONG).show();
Log.e(TAG, "Reg ID Creation Failed!!!");
}
}
}.execute(null, null, null);
}
J'ai correctement importé le Google Play Services
bibliothèque comme décrit dans la documentation.(https://developers.google.com/android/guides/setup)
Quelqu'un a rencontré cette erreur? Comment puis-je résoudre ce problème?
Environnement de développement utilisé: Eclipse Kepler SR2 avec ADT
Si vous avez besoin d'informations supplémentaires s'il vous plaît commentaire.
Vous devez vous connecter pour publier un commentaire.
J'ai vu que la méthode
getNoBackupFilesDir
est trouvé dans android.de soutien.v4.contenu.ContextCompat.Semble que le problème était que j'avais un vieux appcompat-v7 inclus dans le projet. Télécharger le
SDK manager
la dernière version deAndroid Support Library
, puis suivez les étapes pour L'ajout de bibliothèques avec des ressources et les ajouter à la bibliothèque de votre projet d'application.J'ai eu cette erreur:
dans cette ligne:
La solution pour moi a été la mise à niveau de ce:
dans: