6

Google'dan (https://developers.google.com/cloud-messaging/android/client) yönergeleri uygulayarak yeni GCM Client Android'i uygulamaya çalışıyorum. İki farklı cihaz için biraz farklı hatalar alıyorum. Her iki cihaz için getNoBackupFilesDir yöntemi için NoSuchMethodError aldığımı fark ettim.
Bu bir Android 4.2.2 için logcat geçerli:Android için yeni GCM İstemcisini uygulayan sorunlar

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 

Ve bu bir Android 5.1.1 için logcat geçerli:

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 

hattı 113 'de bu var:

InstanceID instanceID = InstanceID.getInstance(applicationContext); 

burada kullanılmış:

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

Google Play Services kitaplığındaki belgelerde anlatıldığı gibi doğru şekilde aktardım. (https://developers.google.com/android/guides/setup)

Bu hatalarla karşılaştı mı? Bunu nasıl çözebilirim?

Kullanılan geliştirme ortamı: ADT ile Eclipse Kepler SR2
Ek bilgiye ihtiyacınız varsa lütfen yorum yapın.

cevap

13

getNoBackupFilesDir yönteminin android.support.v4.content.ContextCompat adresinde bulunduğunu gördüm.

Sorun, projede yer alan eski bir appcompat-v7 uygulamasının olmasıydı. SDK manager ile Android Support Library son sürümünü indirin ve Adding libraries with resources için adımları izleyin ve kitaplığı uygulama projenize ekleyin.

+3

Benzer bir konu, benim libs dir güncel bir android-support-v4.jar vardı; daha yeni sürüme güncellendi, problem çözüldü. – Kurt

+0

@Kurt: Haklısın. Cevap olarak göndermelisin. –

+1

Bu aynı hatayı yaşıyordum ve uygulamanızın build.gradle'ında appcompat-v7 ve support-v4'ü bulduğum cevabı sayesinde teşekkürler. Desteği-v4 çıkarma hile yaptı! – DJTano

0

bu hata var: bu satırda

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) 

:

InstanceID.getInstance(this); 

benim için çözüm bu şekilde geliştirilmesi oldu:

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

içine:

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

11.8.0'a güncelliyorum ama bazen çöküyor – quangkid

İlgili konular