最近在做一个移动项目,其中用到了推送服务,查阅了很多资料,大多数都用的第三方推送,于是思考之下选择了百度云推送,实时,免费是它的一大优势。
第一步:
注册百度开发者,http://developer.baidu.com,在创建一个工程:http://developer.baidu.com/console#app/project,名字可以随便取,会获取到ID,api key,scret key,这三个东西非常重要。
之后就是点击左边的云推行进行推送设置,可以下载一个配好APIID的apkdemo,包括代码,也可以后期自己配。
第二部:
打开安卓端的demo,在AndroidManifest.xml中
百度推送demo中有一个百度账号推送,既用百度账号登录后在推送,但一般不用,因为大家都是有自己的用户以及登陆体系,这时我们只需要在PushDemoActivity这个类中提取
// 以apikey的方式登录,一般放在主Activity的onCreate中 PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY, Utils.getMetaValue(PushDemoActivity.this, "api_key"));
这段代码,这里面是不适用百度账号,会返回分配的appid,channel_id,user_id,其中appid就是第一步中的ID,我们会在一下代码中获取到这些(PushDemoActivity中),
private void handleIntent(Intent intent) { String action = intent.getAction(); if (Utils.ACTION_RESPONSE.equals(action)) { String method = intent.getStringExtra(Utils.RESPONSE_METHOD); if (PushConstants.METHOD_BIND.equals(method)) { String toastStr = ""; int errorCode = intent.getIntExtra(Utils.RESPONSE_ERRCODE, 0); if (errorCode == 0) { String content = intent .getStringExtra(Utils.RESPONSE_CONTENT); String appid = ""; String channelid = ""; String userid = ""; try { JSONObject jsonContent = new JSONObject(content); JSONObject params = jsonContent .getJSONObject("response_params"); appid = params.getString("appid"); channelid = params.getString("channel_id"); userid = params.getString("user_id"); } catch (JSONException e) { Log.e(Utils.TAG, "Parse bind json infos error: " + e); } SharedPreferences sp = PreferenceManager .getDefaultSharedPreferences(this); Editor editor = sp.edit(); editor.putString("appid", appid); editor.putString("channel_id", channelid); editor.putString("user_id", userid); editor.commit(); showChannelIds(); toastStr = "Bind Success"; } else { toastStr = "Bind Fail, Error Code: " + errorCode; if (errorCode == 30607) { Log.d("Bind Fail", "update channel token-----!"); } } Toast.makeText(this, toastStr, Toast.LENGTH_LONG).show(); } } else if (Utils.ACTION_LOGIN.equals(action)) { String accessToken = intent .getStringExtra(Utils.EXTRA_ACCESS_TOKEN); PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_ACCESS_TOKEN, accessToken); isLogin = true; initButton.setText("更换百度账号初始化Channel"); } else if (Utils.ACTION_MESSAGE.equals(action)) { String message = intent.getStringExtra(Utils.EXTRA_MESSAGE); String summary = "Receive message from server:\n\t"; Log.e(Utils.TAG, summary + message); JSONObject contentJson = null; String contentStr = message; try { contentJson = new JSONObject(message); contentStr = contentJson.toString(4); } catch (JSONException e) { Log.d(Utils.TAG, "Parse message json exception."); } summary += contentStr; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(summary); builder.setCancelable(true); Dialog dialog = builder.create(); dialog.setCanceledOnTouchOutside(true); dialog.show(); } else { Log.i(Utils.TAG, "Activity normally start!"); } }
这里就已经取到了appid,channel_id,user_id,在用以下代码把channel_id,user_id取出来
SharedPreferences sp = PreferenceManager .getDefaultSharedPreferences(this); appId = sp.getString("appid", ""); channelId = sp.getString("channel_id", ""); clientId = sp.getString("user_id", "");
在进行登陆的时候,把channel_id,user_id传回后台保存在表中即可。
客户端主要就是这些,其他的诸如广播注册之类的东西,demo里都有体现,看下即可。
第三步:
服务端代码就很简单了,这里取一个例子,在com.baidu.channel.test包中的ChannelClientTest.java中有很对中推送形式的方法,取一种解释:
public void testPushUnicastAndroidNotification() { /* * @brief 向Android端设备推送单播消息 * message_type = 1 * device_type = 3 */ // 1. 设置developer平台的ApiKey/SecretKey String apiKey = "********************"; String secretKey = "*************************"; ChannelKeyPair pair = new ChannelKeyPair(apiKey, secretKey); // 2. 创建BaiduChannelClient对象实例 BaiduChannelClient channelClient = new BaiduChannelClient(pair); // 3. 若要了解交互细节,请注册YunLogHandler类 channelClient.setChannelLogHandler(new YunLogHandler() { @Override public void onHandle(YunLogEvent event) { System.out.println(event.getMessage()); } }); try { // 4. 创建请求类对象 PushUnicastMessageRequest request = new PushUnicastMessageRequest(); request.setDeviceType(3); request.setChannelId(**********************); request.setUserId("************************"); request.setMessageType(1); request.setMessage("{\"title\":\"Notify_title_danbo\",\"description\":\"Notify_description_content\"}"); // 5. 调用pushMessage接口 PushUnicastMessageResponse response = channelClient .pushUnicastMessage(request); Assert.assertEquals(1, response.getSuccessAmount()); } catch (ChannelClientException e) { // 处理客户端错误异常 e.printStackTrace(); } catch (ChannelServerException e) { // 处理服务端错误异常 System.out.println(String.format( "request_id: %d, error_code: %d, error_message: %s", e.getRequestId(), e.getErrorCode(), e.getErrorMsg())); } }
这里的apiKey和secretKey就是第一步的api key,scret key,setChannelId和setUserId就是第二步返回来的channel_id,user_id,剩下的就是自己编辑文字,直接调用该方法就可以实现推送,还支持富媒体的推送。
最后附上安卓SDK和服务端java版的demo下载地址:
安卓:http://download.csdn.net/detail/love_heller/7206147
java:http://download.csdn.net/detail/love_heller/7206163