Android 百度推送
1. 注册和下载相应的SDK和Demo
注册不多说了。
http://push.baidu.com/sdk/push_client_sdk_for_android
1.1下载SDK和Demo
1.2下载后的文件目录显示
下载的文件中的Demo可以移植到Android项目中;
Libs中的so和jar.一定要复制到项目中的libs文件夹中;
1.3百度推送中创建应用获取相关信息
2. 解析Demo项目的内容和配置
AndroidManifest.xml文件中的配置:
2.1权限必备
<!-- Push service 运行需要的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<!-- 富媒体需要声明的权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
2.2 几个必备的服务及自定义中服务实现的方法
<!-- push应用定义消息receiver声明 ,这个是自定义的一定要-->
<receiver android:name="com.baidu.push.example.MyPushMessageReceiver" >
<intent-filter>
<!-- 接收push消息 -->
<action android:name="com.baidu.android.pushservice.action.MESSAGE" />
<!-- 接收bind,unbind,fetch,delete等反馈消息 -->
<action android:name="com.baidu.android.pushservice.action.RECEIVE" />
<action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
</intent-filter>
</receiver>
<!-- push必须的receviver和service声明 ,下面的几个是直接复制-->
<receiver
android:name="com.baidu.android.pushservice.PushServiceReceiver"
android:process=":bdservice_v1" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
<action android:name="com.baidu.android.pushservice.action.media.CLICK" />
<!-- 以下四项为可选的action声明,可大大提高service存活率和消息到达速度 -->
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>
<receiver
android:name="com.baidu.android.pushservice.RegistrationReceiver"
android:process=":bdservice_v1" >
<intent-filter>
<action android:name="com.baidu.android.pushservice.action.METHOD" />
<action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<service
android:name="com.baidu.android.pushservice.PushService"
android:exported="true"
android:process=":bdservice_v1" >
<intent-filter>
<action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />
</intent-filter>
</service>
<service
android:name="com.baidu.android.pushservice.CommandService"
android:exported="true" />
2.3 MyPushMessageReceiver服务中实现的方法
/*
* Push消息处理receiver。请编写您需要的回调函数, 一般来说: onBind是必须的,用来处理startWork返回值;
*onMessage用来接收透传消息; onSetTags、onDelTags、onListTags是tag相关操作的回调;
*onNotificationClicked在通知被点击时回调; onUnbind是stopWork接口的返回值回调
* 返回值中的errorCode,解释如下:
*0 - Success
*10001 - Network Problem
*10101 Integrate Check Error
*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 PushMessageReceiver {
/**
* 调用PushManager.startWork后,sdk将对push
* server发起绑定请求,这个过程是异步的。绑定请求的结果通过onBind返回。 如果您需要用单播推送,需要把这里获取的channel
* id和user id上传到应用server中,再调用server接口用channel id和user id给单个手机或者用户推送。
public void onBind(Context context, int errorCode, String appid,
String userId, String channelId, String requestId) {
public void onMessage(Context context, String message,
String customContentString) {
public void onNotificationArrived(Context context, String title,
String description, String customContentString) {
public void onNotificationClicked(Context context, String title,
String description, String customContentString) {
public void onSetTags(Context context, int errorCode,
List sucessTags, List failTags, String requestId) {
public void onDelTags(Context context, int errorCode,
public void onUnbind(Context context, int errorCode, String requestId) {
3. 推送流程的执行和细节操作
3.1 登录、注册百度推送
Push: 以apikey的方式登录,一般放在主Activity的onCreate中。
PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY, “pBB9DbmgVAfLXCLCGqlCF1ag”);
// Push: 如果想基于地理位置推送,可以打开支持地理位置的推送的开关
// PushManager.enableLbs(getApplicationContext());
如果登录成功的话,一定会回调
MyPushMessageReceiver中的onBind 的方法,并且errorCode中显示的是0;
// Push: 如果想基于地理位置推送,可以打开支持地理位置的推送的开关
PushManager.enableLbs(getApplicationContext());
3.2 自定义NotificationBuilder,实现高级定义
// Push: 设置自定义的通知样式,具体API介绍见用户手册,如果想使用系统默认的可以不加这段代码
// 请在通知推送界面中,高级设置->通知栏样式->自定义样式,选中并且填写值:1,
// 与下方代码中 PushManager.setNotificationBuilder(this, 1, cBuilder)中的第二个参数对应
CustomPushNotificationBuilder cBuilder = new CustomPushNotificationBuilder(
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_VIBRATE);
//通知到达的时候显示的图片;
cBuilder.setStatusbarIcon(this.getApplicationInfo().icon);
cBuilder.setLayoutDrawable(resource.getIdentifier(
“simple_notification_icon”, “drawable”, pkgName));
//下面的通知到达的时候有声音
cBuilder.setNotificationSound(Uri.withAppendedPath(
Audio.Media.INTERNAL_CONTENT_URI, “6”).toString());
// 推送高级设置,通知栏样式设置为下面的ID
PushManager.setNotificationBuilder(this, 1, cBuilder);
显示的效果如下:
3.3 推送信息设置—用户范围设置
1、标题信息和内容可以不用解释太多;
2、用户范围有四种:
3.3.1. 所有设备
所有设备,很明显,不用解释。
3.3.2. 指定设备
主要是测试的时候使用,指定手机测试;Channel的值会在
MyPushMessageReceiver中的onBind方法中返回给用户获取channelId;
3.3.3. 标签设备
Tag管理接口 Tag的创建与删除 setTags, delTags, onListTags
指定的用户绑定标签,只要在应用中绑定:PushManager.setTags(getApplicationContext(), tags);
同时会回调:MyPushMessageReceiver中的onSetTags方法;
public void onSetTags(Context context, int errorCode, List sucessTags, List failTags, String requestId);
PushMessageReceiver的抽象方法,把receiver类继承PushMessageReceiver可以使用。setTags() 的回调函数。
public void onDelTags(Context context, int errorCode, List sucessTags, List failTags, String requestId)
PushMessageReceiver的抽象方法,把receiver类继承PushMessageReceiver可以使用。delTags() 的回调函数。
public void onListTags(Context context, int errorCode, List tags, String requestId);
PushMessageReceiver的抽象方法,把receiver类继承PushMessageReceiver可以使用。listTags() 的回调函数。
3.3.4. 精确推送
3.4 推送信息设置—发送时间和离线消息期限
发送时间不解释,代码里面不用设置;
离线信息指的是多少时间以后还能接受到信息;
3.5 推送信息设置—高级设置
如上图,文件的描述如其意;
主要解释一下附加字段:
@Override
public void onMessage(Context context, String message,
String customContentString) {
String messageString = "透传消息 onMessage=\"" + 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);
}
3.6推送信息设置—设置免打扰时段
这个功能主要是在app的代码中设置:
/ Push: 设置免打扰时段
// startHour startMinute:开始 时间 ,24小时制,取值范围 0~23 0~59
// endHour endMinute:结束 时间 ,24小时制,取值范围 0~23 0~59
PushManager.setNoDisturbMode(getApplicationContext(),
startHour, startMinute, endHour, endMinute);
PushManager.setNoDisturbMode(Context context, int startHour, int startMinute, int endHour, int endMinute);
功能:PushManager类定义的静态方法,设置免打扰模式的具体时段,该时间内处于免打扰模式,通知到达时去除通知的提示音、振动以及提示灯闪烁。
注意:如果开始时间小于结束时间,免打扰时段为当天的起始时间到结束时间;如果开始时间大于结束时间,免打扰时段为第一天起始时间到第二天结束时间;如果开始时间和结束时间的设置均为00:00时,取消免打扰时段功能。
参数:
• context:当前执行Context
• startHour,startMinute:起始时间,24小时制,取值范围0~23,0~59
• endHour,endMinute:结束时间,24小时制,取值范围0~23,0~59
4. 创建透传消息
当设备接收到透传消息时,消息不会在通知栏展示,只是静默回调开发者自定义Receiver中的onMessage函数。手机收到消息后不会有任何现象,因为透传消息对用户完全透明,用户无法感知,便于开发者在不影响用户的情况下对app进行操作。开发者可以通过log内容和自定义的回调函数onMessage中打印该内容,确认消息到达,并执行开发者指定操作。
@Override
public void onMessage(Context context, String message,
String customContentString) {
String messageString = “透传消息 onMessage=\”” + 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();
}
}
5. 总结
上述就是Android 百度推送的主要功能;如果不足之处,请斧正;