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