Android第十三期 - 百度云推送(百度后台版)
这回比较费事儿,我给学弟学妹分解一下,下面开始:
配置部分:
1.去百度云推送注册账号,配置一下,如图:
2.点击消息跳转的配置部分,如图:
3.发送消息的配置,如图:
这样就完成百度后台的发送消息的服务器的配置了。
接着是App的代码部分:
1.MyPushMessageReceiver:
package com.baidu.push.example; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.json.JSONException; import org.json.JSONObject; import android.content.Context; import android.content.Intent; import android.text.TextUtils; import android.util.Log; import com.baidu.frontia.api.FrontiaPushMessageReceiver; /** * Push消息处理receiver。请编写您需要的回调函数, 一般来说: onBind是必须的,用来处理startWork返回值; * onMessage用来接收透传消息; onSetTags、onDelTags、onListTags是tag相关操作的回调; * onNotificationClicked在通知被点击时回调; onUnbind是stopWork接口的返回值回调 * * 返回值中的errorCode,解释如下: * 0 - Success * 10001 - Network Problem * 30600 - Internal Server Error * 30601 - Method Not Allowed * 30602 - Request Params Not Valid * 30603 - Authentication Failed * 30604 - Quota Use Up Payment Required * 30605 - Data Required Not Found * 30606 - Request Time Expires Timeout * 30607 - Channel Token Timeout * 30608 - Bind Relation Not Found * 30609 - Bind Number Too Many * * 当您遇到以上返回错误时,如果解释不了您的问题,请用同一请求的返回值requestId和errorCode联系我们追查问题。 * */ public class MyPushMessageReceiver extends FrontiaPushMessageReceiver { /** TAG to Log */ public static final String TAG = MyPushMessageReceiver.class .getSimpleName(); /** * 调用PushManager.startWork后,sdk将对push * server发起绑定请求,这个过程是异步的。绑定请求的结果通过onBind返回。 如果您需要用单播推送,需要把这里获取的channel * id和user id上传到应用server中,再调用server接口用channel id和user id给单个手机或者用户推送。 * * @param context * BroadcastReceiver的执行Context * @param errorCode * 绑定接口返回值,0 - 成功 * @param appid * 应用id。errorCode非0时为null * @param userId * 应用user id。errorCode非0时为null * @param channelId * 应用channel id。errorCode非0时为null * @param requestId * 向服务端发起的请求id。在追查问题时有用; * @return none */ @Override public void onBind(Context context, int errorCode, String appid, String userId, String channelId, String requestId) { String responseString = "onBind errorCode=" + errorCode + " appid=" + appid + " userId=" + userId + " channelId=" + channelId + " requestId=" + requestId; Log.d(TAG, responseString); // 绑定成功,设置已绑定flag,可以有效的减少不必要的绑定请求 if (errorCode == 0) { Utils.setBind(context, true); } // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑 updateContent(context, responseString); } /** * 接收透传消息的函数。 * * @param context * 上下文 * @param message * 推送的消息 * @param customContentString * 自定义内容,为空或者json字符串 */ @Override public void onMessage(Context context, String message, String customContentString) { String messageString = "透传消息 message=\"" + message + "\" customContentString=" + customContentString; Log.d(TAG, messageString); // 自定义内容获取方式,mykey和myvalue对应透传消息推送时自定义内容中设置的键和值 if (!TextUtils.isEmpty(customContentString)) { JSONObject customJson = null; try { customJson = new JSONObject(customContentString); String myvalue = null; if (customJson.isNull("mykey")) { myvalue = customJson.getString("mykey"); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑 updateContent(context, messageString); } /** * 接收通知点击的函数。注:推送通知被用户点击前,应用无法通过接口获取通知的内容。 * * @param context * 上下文 * @param title * 推送的通知的标题 * @param description * 推送的通知的描述 * @param customContentString * 自定义内容,为空或者json字符串 */ @Override public void onNotificationClicked(Context context, String title, String description, String customContentString) { String notifyString = "通知点击 title=\"" + title + "\" description=\"" + description + "\" customContent=" + customContentString; Log.d(TAG, notifyString); // 自定义内容获取方式,mykey和myvalue对应通知推送时自定义内容中设置的键和值 if (!TextUtils.isEmpty(customContentString)) { JSONObject customJson = null; try { customJson = new JSONObject(customContentString); String myvalue = null; if (customJson.isNull("mykey")) { myvalue = customJson.getString("mykey"); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑 updateContent(context, notifyString); } /** * setTags() 的回调函数。 * * @param context * 上下文 * @param errorCode * 错误码。0表示某些tag已经设置成功;非0表示所有tag的设置均失败。 * @param successTags * 设置成功的tag * @param failTags * 设置失败的tag * @param requestId * 分配给对云推送的请求的id */ @Override public void onSetTags(Context context, int errorCode, List<String> sucessTags, List<String> failTags, String requestId) { String responseString = "onSetTags errorCode=" + errorCode + " sucessTags=" + sucessTags + " failTags=" + failTags + " requestId=" + requestId; Log.d(TAG, responseString); // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑 updateContent(context, responseString); } /** * delTags() 的回调函数。 * * @param context * 上下文 * @param errorCode * 错误码。0表示某些tag已经删除成功;非0表示所有tag均删除失败。 * @param successTags * 成功删除的tag * @param failTags * 删除失败的tag * @param requestId * 分配给对云推送的请求的id */ @Override public void onDelTags(Context context, int errorCode, List<String> sucessTags, List<String> failTags, String requestId) { String responseString = "onDelTags errorCode=" + errorCode + " sucessTags=" + sucessTags + " failTags=" + failTags + " requestId=" + requestId; Log.d(TAG, responseString); // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑 updateContent(context, responseString); } /** * listTags() 的回调函数。 * * @param context * 上下文 * @param errorCode * 错误码。0表示列举tag成功;非0表示失败。 * @param tags * 当前应用设置的所有tag。 * @param requestId * 分配给对云推送的请求的id */ @Override public void onListTags(Context context, int errorCode, List<String> tags, String requestId) { String responseString = "onListTags errorCode=" + errorCode + " tags=" + tags; Log.d(TAG, responseString); // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑 updateContent(context, responseString); } /** * PushManager.stopWork() 的回调函数。 * * @param context * 上下文 * @param errorCode * 错误码。0表示从云推送解绑定成功;非0表示失败。 * @param requestId * 分配给对云推送的请求的id */ @Override public void onUnbind(Context context, int errorCode, String requestId) { String responseString = "onUnbind errorCode=" + errorCode + " requestId = " + requestId; Log.d(TAG, responseString); // 解绑定成功,设置未绑定flag, if (errorCode == 0) { Utils.setBind(context, false); } // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑 updateContent(context, responseString); } private void updateContent(Context context, String content) { Log.d(TAG, "updateContent"); String logText = "" + Utils.logStringCache; if (!logText.equals("")) { logText += "\n"; } SimpleDateFormat sDateFormat = new SimpleDateFormat("HH-mm-ss"); logText += sDateFormat.format(new Date()) + ": "; logText += content; Utils.logStringCache = logText; Intent intent = new Intent(); intent.setClass(context.getApplicationContext(), PushDemoActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.getApplicationContext().startActivity(intent); } }
注意:这里面的方法onMessage和 onNotificationClicked可以自定义消息的显示样式。
2.要跳转到的MainActivity:
package com.baidu.push.example; import com.gaoxiaotongctone.R; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.custom_activity); } }
3.主窗体PushDemoActivity的显示:
package com.baidu.push.example; import java.util.Calendar; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.Notification; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; import android.util.Log; import android.view.View; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; import com.baidu.android.pushservice.CustomPushNotificationBuilder; import com.baidu.android.pushservice.PushConstants; import com.baidu.android.pushservice.PushManager; /* * 云推送Demo主Activity。 * 代码中,注释以Push标注开头的,表示接下来的代码块是Push接口调用示例 */ public class PushDemoActivity extends Activity implements View.OnClickListener { private static final String TAG = PushDemoActivity.class.getSimpleName(); RelativeLayout mainLayout = null; int akBtnId = 0; int initBtnId = 0; int richBtnId = 0; int setTagBtnId = 0; int delTagBtnId = 0; int clearLogBtnId = 0; Button initButton = null; Button initWithApiKey = null; Button displayRichMedia = null; Button setTags = null; Button delTags = null; Button clearLog = null; TextView logText = null; ScrollView scrollView = null; public static int initialCnt = 0; private boolean isLogin = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Utils.logStringCache = Utils.getLogText(getApplicationContext()); Resources resource = this.getResources(); String pkgName = this.getPackageName(); setContentView(resource.getIdentifier("main", "layout", pkgName)); akBtnId = resource.getIdentifier("btn_initAK", "id", pkgName); initBtnId = resource.getIdentifier("btn_init", "id", pkgName); richBtnId = resource.getIdentifier("btn_rich", "id", pkgName); setTagBtnId = resource.getIdentifier("btn_setTags", "id", pkgName); delTagBtnId = resource.getIdentifier("btn_delTags", "id", pkgName); clearLogBtnId = resource.getIdentifier("btn_clear_log", "id", pkgName); initWithApiKey = (Button) findViewById(akBtnId); initButton = (Button) findViewById(initBtnId); displayRichMedia = (Button) findViewById(richBtnId); setTags = (Button) findViewById(setTagBtnId); delTags = (Button) findViewById(delTagBtnId); clearLog = (Button) findViewById(clearLogBtnId); logText = (TextView) findViewById(resource.getIdentifier("text_log", "id", pkgName)); scrollView = (ScrollView) findViewById(resource.getIdentifier( "stroll_text", "id", pkgName)); initWithApiKey.setOnClickListener(this); initButton.setOnClickListener(this); setTags.setOnClickListener(this); delTags.setOnClickListener(this); displayRichMedia.setOnClickListener(this); clearLog.setOnClickListener(this); // Push: 以apikey的方式登录,一般放在主Activity的onCreate中。 // 这里把apikey存放于manifest文件中,只是一种存放方式, // 您可以用自定义常量等其它方式实现,来替换参数中的Utils.getMetaValue(PushDemoActivity.this, // "api_key") // 通过share preference实现的绑定标志开关,如果已经成功绑定,就取消这次绑定 if (!Utils.hasBind(getApplicationContext())) { PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY, Utils.getMetaValue(PushDemoActivity.this, "api_key")); // Push: 如果想基于地理位置推送,可以打开支持地理位置的推送的开关 // PushManager.enableLbs(getApplicationContext()); } // Push: 设置自定义的通知样式,具体API介绍见用户手册,如果想使用系统默认的可以不加这段代码 // 请在通知推送界面中,高级设置->通知栏样式->自定义样式,选中并且填写值:1, // 与下方代码中 PushManager.setNotificationBuilder(this, 1, cBuilder)中的第二个参数对应 CustomPushNotificationBuilder cBuilder = new CustomPushNotificationBuilder( getApplicationContext(), resource.getIdentifier( "notification_custom_builder", "layout", pkgName), resource.getIdentifier("notification_icon", "id", pkgName), resource.getIdentifier("notification_title", "id", pkgName), resource.getIdentifier("notification_text", "id", pkgName)); cBuilder.setNotificationFlags(Notification.FLAG_AUTO_CANCEL); cBuilder.setNotificationDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE); cBuilder.setStatusbarIcon(this.getApplicationInfo().icon); cBuilder.setLayoutDrawable(resource.getIdentifier( "simple_notification_icon", "drawable", pkgName)); PushManager.setNotificationBuilder(this, 1, cBuilder); } @Override public void onClick(View v) { if (v.getId() == akBtnId) { initWithApiKey(); } else if (v.getId() == initBtnId) { initWithBaiduAccount(); } else if (v.getId() == richBtnId) { openRichMediaList(); } else if (v.getId() == setTagBtnId) { setTags(); } else if (v.getId() == delTagBtnId) { deleteTags(); } else if (v.getId() == clearLogBtnId) { Utils.logStringCache = ""; Utils.setLogText(getApplicationContext(), Utils.logStringCache); updateDisplay(); } else { } } // 打开富媒体列表界面 private void openRichMediaList() { // Push: 打开富媒体消息列表 Intent sendIntent = new Intent(); sendIntent.setClassName(getBaseContext(), "com.baidu.android.pushservice.richmedia.MediaListActivity"); sendIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PushDemoActivity.this.startActivity(sendIntent); } // 删除tag操作 private void deleteTags() { LinearLayout layout = new LinearLayout(PushDemoActivity.this); layout.setOrientation(LinearLayout.VERTICAL); final EditText textviewGid = new EditText(PushDemoActivity.this); textviewGid.setHint("请输入多个标签,以英文逗号隔开"); layout.addView(textviewGid); AlertDialog.Builder builder = new AlertDialog.Builder( PushDemoActivity.this); builder.setView(layout); builder.setPositiveButton("删除标签", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Push: 删除tag调用方式 List<String> tags = Utils.getTagsList(textviewGid .getText().toString()); PushManager.delTags(getApplicationContext(), tags); } }); builder.show(); } // 设置标签,以英文逗号隔开 private void setTags() { LinearLayout layout = new LinearLayout(PushDemoActivity.this); layout.setOrientation(LinearLayout.VERTICAL); final EditText textviewGid = new EditText(PushDemoActivity.this); textviewGid.setHint("请输入多个标签,以英文逗号隔开"); layout.addView(textviewGid); AlertDialog.Builder builder = new AlertDialog.Builder( PushDemoActivity.this); builder.setView(layout); builder.setPositiveButton("设置标签", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Push: 设置tag调用方式 List<String> tags = Utils.getTagsList(textviewGid .getText().toString()); PushManager.setTags(getApplicationContext(), tags); } }); builder.show(); } // 以apikey的方式绑定 private void initWithApiKey() { // Push: 无账号初始化,用api key绑定 PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY, Utils.getMetaValue(PushDemoActivity.this, "api_key")); } // 以百度账号登陆,获取access token来绑定 private void initWithBaiduAccount() { if (isLogin) { // 已登录则清除Cookie, access token, 设置登录按钮 CookieSyncManager.createInstance(getApplicationContext()); CookieManager.getInstance().removeAllCookie(); CookieSyncManager.getInstance().sync(); isLogin = false; initButton.setText("登陆百度账号初始化Channel"); } // 跳转到百度账号登录的activity Intent intent = new Intent(PushDemoActivity.this, LoginActivity.class); startActivity(intent); } @Override public void onStart() { super.onStart(); } @Override public void onResume() { super.onResume(); Log.d(TAG, "onResume"); updateDisplay(); } @Override protected void onNewIntent(Intent intent) { String action = intent.getAction(); if (Utils.ACTION_LOGIN.equals(action)) { // Push: 百度账号初始化,用access token绑定 String accessToken = intent .getStringExtra(Utils.EXTRA_ACCESS_TOKEN); PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_ACCESS_TOKEN, accessToken); isLogin = true; initButton.setText("更换百度账号"); } updateDisplay(); } @Override public void onStop() { super.onStop(); } @Override public void onDestroy() { Utils.setLogText(getApplicationContext(), Utils.logStringCache); super.onDestroy(); } // 更新界面显示内容 private void updateDisplay() { Log.d(TAG, "updateDisplay, logText:" + logText + " cache: " + Utils.logStringCache); if (logText != null) { logText.setText(Utils.logStringCache); } if (scrollView != null) { scrollView.fullScroll(ScrollView.FOCUS_DOWN); } } }
注意:这句话才是关键。
PushManager.startWork(getApplicationContext(),
PushConstants.LOGIN_TYPE_API_KEY,
Utils.getMetaValue(PushDemoActivity.this, "api_key"));
下面分别是打开另一个activity和打开指定的网页的效果图:
附图:
本文出自 “梁肖技术中心” 博客,请务必保留此出处http://liangxiao.blog.51cto.com/3626612/1544813
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。