我试图做的推送通知在Android中使用GCM。 我读了GCM和他们的演示应用程序的谷歌文档。 我创建这里提到的客户端程序http://android.amolgupta.in/
。 但我没有得到注册ID。 另外,我没有得到一些分数,如:
- 我是否需要服务器程序也与此
- 在谷歌演示应用程序,他们提到,我需要在“样品/ GCM-演示服务器/的WebContent / WEB-INF /班/ api.key”更改API密钥是否有必要每次都做到这一点,因为我在创建新项目
任何一个可以给我提供比谷歌提供这样我清楚我的概念的其他合适的项目。
任何帮助将不胜感激。
在这里,我已经写了如何获取的RegID和通知从头开始了几步
- 建立在谷歌云/注册应用程序
- 设置云SDK与发展
- 对于GCM配置项目
- 获取设备的注册ID
- 发送推送通知
- 收到推送通知
你可以在这里找到一个完整的教程:
入门与Android推送通知:谷歌最新的云端通讯(GCM) -一步一步完全教程
代码段获得注册ID(用于推送通知设备令牌)。
对于GCM配置项目
更新AndroidManifest文件
为了使GCM在我们的项目,我们需要一些权限添加到我们的清单文件。 去AndroidManifest.xml
添加以下代码:添加权限
<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="android.permission.VIBRATE" />
<uses-permission android:name=“.permission.RECEIVE" />
<uses-permission android:name=“<your_package_name_here>.permission.C2D_MESSAGE" />
<permission android:name=“<your_package_name_here>.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
添加GCM广播接收机声明在应用程序标签:
<application
<receiver
android:name=".GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" ]]>
<intent-filter]]>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="" />
</intent-filter]]>
</receiver]]>
<application/>
添加GCM服务声明
<application
<service android:name=".GcmIntentService" />
<application/>
获得注册ID(推送通知设备令牌)
现在去你的启动/飞溅活动
添加常量和类变量
private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
public static final String EXTRA_MESSAGE = "message";
public static final String PROPERTY_REG_ID = "registration_id";
private static final String PROPERTY_APP_VERSION = "appVersion";
private final static String TAG = "LaunchActivity";
protected String SENDER_ID = "Your_sender_id";
private GoogleCloudMessaging gcm =null;
private String regid = null;
private Context context= null;
更新的OnCreate和方法的onResume
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch);
context = getApplicationContext();
if (checkPlayServices()) {
gcm = GoogleCloudMessaging.getInstance(this);
regid = getRegistrationId(context);
if (regid.isEmpty()) {
registerInBackground();
} else {
Log.d(TAG, "No valid Google Play Services APK found.");
}
}
}
@Override
protected void onResume() {
super.onResume();
checkPlayServices();
}
// # Implement GCM Required methods(Add below methods in LaunchActivity)
private boolean checkPlayServices() {
int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (resultCode != ConnectionResult.SUCCESS) {
if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
GooglePlayServicesUtil.getErrorDialog(resultCode, this,
PLAY_SERVICES_RESOLUTION_REQUEST).show();
} else {
Log.d(TAG, "This device is not supported - Google Play Services.");
finish();
}
return false;
}
return true;
}
private String getRegistrationId(Context context) {
final SharedPreferences prefs = getGCMPreferences(context);
String registrationId = prefs.getString(PROPERTY_REG_ID, "");
if (registrationId.isEmpty()) {
Log.d(TAG, "Registration ID not found.");
return "";
}
int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
int currentVersion = getAppVersion(context);
if (registeredVersion != currentVersion) {
Log.d(TAG, "App version changed.");
return "";
}
return registrationId;
}
private SharedPreferences getGCMPreferences(Context context) {
return getSharedPreferences(LaunchActivity.class.getSimpleName(),
Context.MODE_PRIVATE);
}
private static int getAppVersion(Context context) {
try {
PackageInfo packageInfo = context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0);
return packageInfo.versionCode;
} catch (NameNotFoundException e) {
throw new RuntimeException("Could not get package name: " + e);
}
}
private void registerInBackground() {
new AsyncTask() {
@Override
protected Object doInBackground(Object...params) {
String msg = "";
try {
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(context);
}
regid = gcm.register(SENDER_ID);
Log.d(TAG, "########################################");
Log.d(TAG, "Current Device's Registration ID is: " + msg);
} catch (IOException ex) {
msg = "Error :" + ex.getMessage();
}
return null;
}
protected void onPostExecute(Object result) {
//to do here
};
}.execute(null, null, null);
}
注 :请存放REGISTRATION_KEY
,它是用于发送PN消息到GCM重要。 同时请记住:这个关键是对所有设备独特的GCM将发送推送通知REGISTRATION_KEY
只。
在回答第一个问题:是的,你必须运行的服务器应用程序发送消息,以及一个客户端应用程序接收它们。
在回答你的第二个问题:是的,每一个应用程序需要有自己的API密钥。 这关键是你的服务器的应用程序,而不是客户端。
使用此代码使用GCM获得的注册ID
String regId = "", msg = "";
public void getRegisterationID() {
new AsyncTask() {
@Override
protected Object doInBackground(Object...params) {
String msg = "";
try {
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(Login.this);
}
regId = gcm.register(YOUR_SENDER_ID);
Log.d("in async task", regId);
// try
msg = "Device registered, registration ID=" + regId;
} catch (IOException ex) {
msg = "Error :" + ex.getMessage();
}
return msg;
}
}.execute(null, null, null);
}
不要忘了写权限清单中...
我希望它能帮助!