为Android添加谷歌云Messagin(GCM)-注册过程

为Android添加谷歌云Messagin(GCM)-注册过程,android,google-cloud-messaging,Android,Google Cloud Messaging,我已经为GCM的实施挣扎了几个星期,但我真的很想了解它是如何工作的,我决定采取“小步骤” 首先,如前所述,我明白要做的第一件事是注册我的设备/应用程序必须首先向GCM注册 要验证它们是否可以发送和接收消息,客户端应用程序必须向GCM注册。在此过程中,客户端获得唯一的注册令牌 我想知道下面的过程和代码是否代表进行此类注册所需的最低代码(之所以说“非常必要的最低限度代码”,是因为当我学习OpenGL ES 2.0并开始处理着色器时,我发现在处理难以理解的概念时,如果你理解了最低限度的必要代码,你以后

我已经为GCM的实施挣扎了几个星期,但我真的很想了解它是如何工作的,我决定采取“小步骤”

首先,如前所述,我明白要做的第一件事是注册我的设备/应用程序必须首先向GCM注册

要验证它们是否可以发送和接收消息,客户端应用程序必须向GCM注册。在此过程中,客户端获得唯一的注册令牌

我想知道下面的过程和代码是否代表进行此类注册所需的最低代码(之所以说“非常必要的最低限度代码”,是因为当我学习OpenGL ES 2.0并开始处理着色器时,我发现在处理难以理解的概念时,如果你理解了最低限度的必要代码,你以后就可以理解“外围”代码)

向GCM注册应用程序的程序:

  • 在谷歌开发者控制台创建一个项目

  • 激活“安卓云消息”API
  • 在“凭据”处创建服务器API密钥
  • 注意项目ID
  • 注意项目编号
  • 注意服务器API密钥
  • 创建一个Android Studio项目

  • 添加一个“应用引擎后端与CGM”模块类型
  • 在将打开的“appengineweb.xml”窗口中,键入应用程序ID和服务器API密钥
  • 使用项目编号(发件人ID)创建主活动
  • 在我完成所有这些并运行应用程序后,我得到了一个包含152个字符的令牌。 所有这些都正确吗?考虑到我拿回了令牌,我的设备是否已向GCM注册?

    appengine-web.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
        <application>mygcmtest...</application>
        <version>1</version>
        <threadsafe>true</threadsafe>
    
        <system-properties>
            <property name="java.util.logging.config.file" value="WEB-INF/logging.properties" />
    
            <property name="gcm.api.key" value="AIza..." />
        </system-properties>
    </appengine-web-app>
    
    
    mygcmtest。。。
    1.
    真的
    
    主要活动:

    public class MainActivity extends AppCompatActivity {
    
        private final Context mContext = this;
        private final String SENDER_ID = "319899...";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            getGCMToken();
        }
    
        private void getGCMToken() {
            new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... params) {
                    try {
                        InstanceID instanceID = InstanceID.getInstance(mContext);
                        String token = instanceID.getToken(SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
                        Log.e("GCM Token", token);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return null;
                }
            }.execute();
        }
    }
    
    public类MainActivity扩展了AppCompatActivity{
    私有最终上下文mContext=此;
    私有最终字符串发送者_ID=“319899…”;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getGCMToken();
    }
    私有void getGCMToken(){
    新建异步任务(){
    @凌驾
    受保护的Void doInBackground(Void…参数){
    试一试{
    InstanceID InstanceID=InstanceID.getInstance(mContext);
    String token=instanceID.getToken(发送方ID,GoogleCloudMessaging.INSTANCE ID,作用域,null);
    Log.e(“GCM令牌”,令牌);
    }捕获(IOE异常){
    e、 printStackTrace();
    }
    返回null;
    }
    }.execute();
    }
    }
    
    舱单:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.aninha.mygcmtest..." >
    
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.GET_ACCOUNTS" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    
        <permission
            android:name="com.example.gcm.permission.C2D_MESSAGE"
            android:protectionLevel="signature" />
    
        <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    我的答案是,您的问题的源代码还不足以创建两个简单的GCM项目(服务器端和客户端)?:)

    当然,我使用的示例代码仅用于一个非常基本的情况“服务器应用程序发送、客户端应用程序接收和显示消息”

    总之,您需要执行以下步骤:

  • 在上创建一个新项目。在这 为了简单起见,您只需要注意两个值:
    项目编号
    ,这两个值 将在我的客户项目中用作
    发送者\u ID
    ;和
    API服务器密钥
    (创建于凭证),其中 将在我的服务器项目中用作API密钥
  • 为服务器端创建一个新的简单Android项目(基本源代码作为我在前面问题中的答案)
  • 为客户端创建一个新的简单Android项目(基本的源代码是我在前面的问题中的答案,我从最初的源代码处定制)
  • 运行客户端应用程序,您将获得注册令牌(表示您的设备已成功注册)。然后,在服务器应用程序中的
    CLIENT\u REGISTRATION\u token
    变量处粘贴(硬代码)此令牌
  • 运行服务器应用程序,并检查结果(客户端应用程序是否收到消息)
  • 希望这有帮助


    p/S:我不使用任何
    appengine web.xml
    文件

    如果你要回令牌,那么你的设备肯定是注册的。你在另一篇帖子上的第一个回复很好,只是我对两个主要活动类和一些其他次要内容有点困惑。现在我清楚多了。今天我将尝试实现代码,并让您知道result@BKN我想一切都很顺利,我只是在TextView上收到了一条奇怪的消息…{“失败”:1,“结果”:[{“错误”:“未注册”}],“成功”:0,“多播id”:322984…,“规范id”:0}。这就是我应该收到的消息?有关错误响应代码,请转到。可能是“未注册”“错误,您应该清除已安装客户端应用程序的数据以获取新的注册令牌,然后按照步骤4粘贴此新令牌。这意味着服务器应用程序已成功发送。但是,您的客户端应用程序是否收到来自服务器应用程序的任何消息?这取决于您在客户端应用程序上显示消息的方式,因为GCMService是一种服务,当通过“后退”按钮关闭客户端应用程序时,例如,如果使用Toast来显示消息,则消息仍会显示,如果TextView中的setText,当然当时TextView为空,则无法显示setText。若要保存消息以备将来使用,可以使用日志将其保存到文件,或使用shared ref或SQLLite db来存储