在Android上实现GCM

在Android上实现GCM,android,google-cloud-messaging,android-support-library,Android,Google Cloud Messaging,Android Support Library,我想将GCM添加到我的应用程序中,因此我首先遵循了此链接中的教程: 但我无法从服务器发送任何消息,因为它总是返回InvalidRegistration,即使我只是复制粘贴我在应用程序中获得的注册,它是由gcm.register()方法生成的。所以我看了官方网页 表示register()已弃用,应使用InstanceID API。现在我按照页面上的说明进行操作。我得到以下错误: 07-05 14:49:17.066: E/AndroidRuntime(25823): FATAL EXCEPTI

我想将GCM添加到我的应用程序中,因此我首先遵循了此链接中的教程:

但我无法从服务器发送任何消息,因为它总是返回InvalidRegistration,即使我只是复制粘贴我在应用程序中获得的注册,它是由gcm.register()方法生成的。所以我看了官方网页

表示register()已弃用,应使用InstanceID API。现在我按照页面上的说明进行操作。我得到以下错误:

 07-05 14:49:17.066: E/AndroidRuntime(25823): FATAL EXCEPTION: AsyncTask #1
07-05 14:49:17.066: E/AndroidRuntime(25823): Process: com.example.studentapp, PID: 25823
07-05 14:49:17.066: E/AndroidRuntime(25823): java.lang.RuntimeException: An error occured while executing doInBackground()
07-05 14:49:17.066: E/AndroidRuntime(25823):    at android.os.AsyncTask$3.done(AsyncTask.java:300)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at java.lang.Thread.run(Thread.java:818)
07-05 14:49:17.066: E/AndroidRuntime(25823): 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.studentapp-2/base.apk)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at com.google.android.gms.iid.zzd.zzde(Unknown Source)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at com.google.android.gms.iid.zzd.<init>(Unknown Source)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at com.google.android.gms.iid.zzd.<init>(Unknown Source)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at com.google.android.gms.iid.InstanceID.zza(Unknown Source)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at com.google.android.gms.iid.InstanceID.getInstance(Unknown Source)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at com.example.studentapp.register_gcm.doInBackground(register_gcm.java:41)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at com.example.studentapp.register_gcm.doInBackground(register_gcm.java:1)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
07-05 14:49:17.066: E/AndroidRuntime(25823):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
07-05 14:49:17.066: E/AndroidRuntime(25823):    ... 4 more
07-0514:49:17.066:E/AndroidRuntime(25823):致命异常:异步任务#1
07-0514:49:17.066:E/AndroidRuntime(25823):进程:com.example.studentapp,PID:25823
07-05 14:49:17.066:E/AndroidRuntime(25823):java.lang.RuntimeException:执行doInBackground()时出错
07-05 14:49:17.066:E/AndroidRuntime(25823):在android.os.AsyncTask$3.done(AsyncTask.java:300)
07-05 14:49:17.066:E/AndroidRuntime(25823):在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
07-05 14:49:17.066:E/AndroidRuntime(25823):位于java.util.concurrent.FutureTask.setException(FutureTask.java:222)
07-0514:49:17.066:E/AndroidRuntime(25823):在java.util.concurrent.FutureTask.run(FutureTask.java:242)
07-05 14:49:17.066:E/AndroidRuntime(25823):在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
07-05 14:49:17.066:E/AndroidRuntime(25823):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
07-05 14:49:17.066:E/AndroidRuntime(25823):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
07-0514:49:17.066:E/AndroidRuntime(25823):在java.lang.Thread.run(Thread.java:818)上
07-05 14:49:17.066:E/AndroidRuntime(25823):由以下原因引起:java.lang.NoSuchMethodError:没有虚拟方法getnobackfilesdir(Landroid/content/Context;)Ljava/io/File;类内Landroid/support/v4/content/ContextCompat;或其超类(在/data/app/com.example.studentapp-2/base.apk中出现“android.support.v4.content.ContextCompat”声明)
07-05 14:49:17.066:E/AndroidRuntime(25823):在com.google.android.gms.iid.zzd.zzde(未知来源)
07-05 14:49:17.066:E/AndroidRuntime(25823):在com.google.android.gms.iid.zzd(未知来源)
07-05 14:49:17.066:E/AndroidRuntime(25823):在com.google.android.gms.iid.zzd(未知来源)
07-05 14:49:17.066:E/AndroidRuntime(25823):在com.google.android.gms.iid.InstanceID.zza(未知来源)
07-05 14:49:17.066:E/AndroidRuntime(25823):在com.google.android.gms.iid.InstanceID.getInstance(未知来源)
2007-05 14:49:17.066:E/AndroidRuntime(25823):在com.example.studentapp.register\u gcm.doInBackground(register\u gcm.java:41)
2007-05 14:49:17.066:E/AndroidRuntime(25823):在com.example.studentapp.register\u gcm.doInBackground(register\u gcm.java:1)
07-05 14:49:17.066:E/AndroidRuntime(25823):在android.os.AsyncTask$2.call(AsyncTask.java:288)
07-05 14:49:17.066:E/AndroidRuntime(25823):在java.util.concurrent.FutureTask.run(FutureTask.java:237)
2007-05 14:49:17.066:E/AndroidRuntime(25823):。。。4更多
因此,我在下面的链接中提出了另一个类似的问题:

我有19.1版的支持库,无法使用sdk管理器进一步升级

我的注册代码是

package com.example.studentapp;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;

import com.google.android.gms.gcm.GoogleCloudMessaging;
import com.google.android.gms.iid.InstanceID;

public  class register_gcm extends AsyncTask<Object, Integer, String> {


     GoogleCloudMessaging gcm;
     Context c;
     String regid;
     String PROJECT_NUMBER = "981827135766";






                @Override
                protected String doInBackground(Object... arg0) {
                    // TODO Auto-generated method stub


                     String msg = "";
                        try {
                          /*  if (gcm == null) {
                                gcm = GoogleCloudMessaging.getInstance(c);
                            }
                            regid = gcm.register(PROJECT_NUMBER);
                            msg = "Device registered, registration ID=" + regid;
                            Log.d("GCM",  msg + regid);
                            */
                            InstanceID instanceID = InstanceID.getInstance(c);
                            String token = instanceID.getToken(PROJECT_NUMBER,
                                    GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
                            Log.d("GCM",  token);

                        } catch (IOException ex) {
                            msg = "Error :" + ex.getMessage();

                        }
                        return regid;
                    }


                @Override
                protected void onPostExecute(String msg) {

                      try {

                            FileOutputStream fos = c.openFileOutput("register_status.zaf", Context.MODE_PRIVATE);

                            fos.write(regid.getBytes());

                            fos.close();

                        } catch (Exception e) {

                            e.printStackTrace();

                        }




                }



}
package com.example.studentapp;
导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入android.content.Context;
导入android.os.AsyncTask;
导入android.util.Log;
导入com.google.android.gms.gcm.GoogleCloudMessaging;
导入com.google.android.gms.iid.InstanceID;
公共类寄存器\u gcm扩展异步任务{
谷歌云通讯gcm;
上下文c;
字符串寄存器;
字符串项目_NUMBER=“981827135766”;
@凌驾
受保护的字符串doInBackground(对象…arg0){
//TODO自动生成的方法存根
字符串msg=“”;
试一试{
/*如果(gcm==null){
gcm=GoogleCloudMessaging.getInstance(c);
}
regid=gcm登记册(项目编号);
msg=“设备已注册,注册ID=“+regid;
Log.d(“GCM”,msg+regid);
*/
InstanceID InstanceID=InstanceID.getInstance(c);
字符串标记=instanceID.getToken(项目编号,
GoogleCloudMessaging.INSTANCE_ID_SCOPE,null);
Log.d(“GCM”,令牌);
}捕获(IOEX异常){
msg=“错误:”+ex.getMessage();
}
返回注册表;
}
@凌驾
受保护的void onPostExecute(字符串msg){
试一试{
FileOutputStream fos=c.openFileOutput(“register\u status.zaf”,Context.MODE\u PRIVATE);
fos.write(regid.getBytes());
fos.close();
}捕获(例外e){
e、 printStackTrace();
}
}
}
那么我该如何解决这个问题呢?

没关系


我所做的是,在较新版本的Eclipse上安装最新的ADT插件,更新支持库,并将构建目标更改为API 22

这里的教程和示例对我很有用,我在给定链接上遵循教程。我的问题在于支持库尝试克隆他们的示例,看看它是否有效。这个例子对我很有用。也许你需要在你的手机上更新google play,但是这个例子给出了一个信息,如果你需要的话,我使用Eclipse ADT。这个项目是建立在Android Studio上的