6

Próbuję zaimplementować nowy GCM Client na Androidzie zgodnie z wytycznymi Google (https://developers.google.com/cloud-messaging/android/client). Otrzymuję nieznacznie różne błędy dla dwóch różnych urządzeń. Zauważyłem, że otrzymuję NoSuchMethodError dla metody getNoBackupFilesDir dla obu urządzeń.
To logcat dla Android 4.2.2:Problemy z implementacją nowego klienta GCM na Androida

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 

I to jest logcat dla 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 

Na linii 113 mam to:

InstanceID instanceID = InstanceID.getInstance(applicationContext); 

Używany tutaj:

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

ja poprawnie importowane do biblioteki Google Play Services jak opisano w dokumentacji. (https://developers.google.com/android/guides/setup)

Czy ktoś napotkał ten błąd? Jak mogę to rozwiązać?

Zastosowane środowisko programistyczne: Eclipse Kepler SR2 z ADT
Jeśli potrzebujesz dodatkowych informacji, prosimy o komentarz.

Odpowiedz

13

Widziałem, że metoda getNoBackupFilesDir znajduje się w android.support.v4.content.ContextCompat.

Wydaje się, że problem polegał na tym, że miałem starą aplikację appcompat-v7 uwzględnioną w projekcie. Pobierz za pomocą SDK manager ostatnią wersję Android Support Library, a następnie postępuj zgodnie z instrukcjami dla Adding libraries with resources i dodaj bibliotekę do swojego projektu aplikacji.

+3

Podobny problem, miałem już przestarzałe wsparcie dla Androida-v4.jar w katalogu moich bibliotek; zaktualizowany do nowszej wersji, problem rozwiązany. – Kurt

+0

@Kurt: Masz rację. Powinieneś opublikować to jako odpowiedź. –

+1

Wystąpił ten sam błąd i dzięki twojej odpowiedzi dowiedziałem się, że mam appcompat-v7 i support-v4 na build.gradle mojej aplikacji. Usunięcie support-v4 rozwiązało problem! – DJTano

0

mam ten błąd:

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) 

w tej linii:

InstanceID.getInstance(this); 

Rozwiązanie dla mnie było to uaktualnienie:

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' 
} 

do:

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

Aktualizuję do 11.8.0, ale czasami się zawiesza – quangkid