eclipse 为 Android 实现新的 GCM 客户端的问题

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/30705235/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 22:41:18  来源:igfitidea点击:

Problems implementing the new GCM Client for Android

javaandroideclipsegoogle-cloud-messaginggoogle-play-services

提问by blackwolf

I'm trying to implement the new GCM Clienton Android following the guidelines from Google (https://developers.google.com/cloud-messaging/android/client). I'm receiving slightly different errors for two different devices. I noticed that I receive NoSuchMethodError for method getNoBackupFilesDir for both the devices.
This is the logcat for an Android 4.2.2:

我正在尝试GCM Client按照 Google ( https://developers.google.com/cloud-messaging/android/client)的指南在 Android上实现新功能。对于两种不同的设备,我收到的错误略有不同。我注意到我收到了两种设备的 getNoBackupFilesDir 方法的 NoSuchMethodError。
这是 Android 4.2.2 的 logcat:

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.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.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.doInBackground(MainActivity.java:113)
06-08 09:01:09.960: E/AndroidRuntime(9138):     at com.example.MainActivity.doInBackground(MainActivity.java:1)
06-08 09:01:09.960: E/AndroidRuntime(9138):     at android.os.AsyncTask.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

And this is the logcat for an Android 5.1.1:

这是 Android 5.1.1 的 logcat:

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.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.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.doInBackground(MainActivity.java:113)
06-08 09:06:49.786: E/AndroidRuntime(2852):     at it.abgsys.htms.MainActivity.doInBackground(MainActivity.java:1)
06-08 09:06:49.786: E/AndroidRuntime(2852):     at android.os.AsyncTask.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

At line 113 I have this:

在第 113 行,我有这个:

InstanceID instanceID = InstanceID.getInstance(applicationContext);

Used here:

在这里使用:

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

I correctly imported the Google Play Serviceslibrary as described in the documentation.(https://developers.google.com/android/guides/setup)

Google Play Services按照文档中的描述正确导入了库。(https://developers.google.com/android/guides/setup

Has anyone encountered this errors? How can I resolve this?

有没有人遇到过这个错误?我该如何解决这个问题?

Development environment used: Eclipse Kepler SR2 with ADT
If you need additional info please comment.

使用的开发环境:Eclipse Kepler SR2 with ADT
如果您需要其他信息,请发表评论。

回答by blackwolf

I saw that the method getNoBackupFilesDiris found in android.support.v4.content.ContextCompat.

我看到该方法getNoBackupFilesDir在android.support.v4.content.ContextCompat 中找到。

Seems that the problem was that I had an old appcompat-v7 included in the project. Download with the SDK managerthe last version of Android Support Libraryand then follow the steps for Adding libraries with resourcesand add the library to your application project.

似乎问题是我在项目中包含了一个旧的 appcompat-v7。使用 的SDK manager最新版本下载,Android Support Library然后按照使用资源添加库并将库添加到您的应用程序项目的步骤进行操作。

回答by CookieMonster

I got this error:

我收到此错误:

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 this line:

在这一行:

InstanceID.getInstance(this);

The solution for me was upgrading this:

我的解决方案是升级这个:

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

into:

进入:

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