在 Android 上实施 GCM

Implementing GCM on Android

我想将 GCM 添加到我的应用程序中,所以我首先按照 link 中的教程进行操作:http://hmkcode.com/android-google-cloud-messaging-tutorial/

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

https://developers.google.com/cloud-messaging/android/client

表示 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.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.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.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

所以我在下面关注了另一个与此类似的问题 link:

我有支持库的 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();

                        }




                }



}

那我该如何解决呢?

没关系,

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