6

Sto cercando di implementare il nuovo GCM Client su Android seguendo le linee guida di Google (https://developers.google.com/cloud-messaging/android/client). Ricevo errori leggermente diversi per due dispositivi diversi. Ho notato che ricevo NoSuchMethodError per il metodo getNoBackupFilesDir per entrambi i dispositivi.
Questa è la logcat per un Android 4.2.2:Problemi di implementazione del nuovo client GCM per Android

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 

e questo è il logcat per un 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 

In linea 113 ho questo:

InstanceID instanceID = InstanceID.getInstance(applicationContext); 

Utilizzato qui:

// 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); 
} 

Ho importato correttamente la libreria Google Play Services come descritto nella documentazione. (https://developers.google.com/android/guides/setup)

Qualcuno ha riscontrato questo errore? Come posso risolvere questo?

Ambiente di sviluppo utilizzato: Eclipse Kepler SR2 con ADT
Se sono necessarie ulteriori informazioni, si prega di commentare.

risposta

13

Ho visto che il metodo getNoBackupFilesDir si trova in android.support.v4.content.ContextCompat.

Sembra che il problema era che avevo un vecchio appcompat-v7 incluso nel progetto. Scaricare con SDK manager l'ultima versione di Android Support Library e quindi seguire i passaggi per Adding libraries with resources e aggiungere la libreria al progetto dell'applicazione.

+3

Problema simile, avevo un android-support-v4.jar obsoleto nella mia directory delle librerie; aggiornato alla versione più recente, problema risolto. – Kurt

+0

@ Kurt: hai ragione. Dovresti postarlo come risposta. –

+1

Stavo avendo lo stesso errore e grazie alla tua risposta ho scoperto che avevo appcompat-v7 e support-v4 sul build.gradle della mia app. Rimozione di supporto-v4 ha fatto il trucco! – DJTano

0

ho ottenuto questo errore:

java.lang.NoSuchMethodError: No static method getNoBackupFilesDir(Landroid/content/Context;)Ljava/io/File; in class Lcom/google/android/gms/common/util/zzx; or its super classes (declaration of 'com.google.android.gms.common.util.zzx' appears in /data/data/com.crave.iapdemo/files/instant-run/dex/slice-com.google.android.gms-play-services-basement-10.0.1_b9da1447b99cc6cbc2fa601fb84d0418780bfa55-classes.dex) 
                     at com.google.android.gms.iid.zzd.zzeC(Unknown Source) 
                     at com.google.android.gms.iid.zzd.<init>(Unknown Source) 
                     at com.google.android.gms.iid.zzd.<init>(Unknown Source) 
                     at com.google.android.gms.iid.InstanceID.zza(Unknown Source) 
                     at com.google.android.gms.iid.InstanceID.getInstance(Unknown Source) 
                     at vodio.labs.crave.gcm.RegistrationIntentService.onHandleIntent(RegistrationIntentService.java:39) 

in questa linea:

InstanceID.getInstance(this); 

La soluzione per me è stato l'aggiornamento questo:

dependencies { 
    // play services 
    compile 'com.google.android.gms:play-services-gcm:9.0.0' 
    compile 'com.google.android.gms:play-services-analytics:9.0.0' 
} 

in:

dependencies { 
    // play services 
    compile 'com.google.android.gms:play-services-gcm:10.0.1' 
    compile 'com.google.android.gms:play-services-analytics:10.0.1' 
} 
+0

Aggiornamento alla versione 11.8.0 ma a volte si blocca – quangkid