您的位置:首页 > 移动开发 > Android开发

Android百度云推送实现消息推送

2015-12-08 19:56 477 查看
百度云推送:http://push.baidu.com/
Android 开发文档:http://push.baidu.com/doc/android/api
Java 服务端开发文档:http://push.baidu.com/doc/java/api

SDK下载:http://push.baidu.com/sdk/push_client_sdk_for_android

1.首先在百度云推送网站上下载Android SDK(客户端)和Java SDK(服务端)

2.根据开发文档配置Android客户端

(1)在百度云推送页面创建应用,创建成功之后会生成API_KEY

http://push.baidu.com/doc/guide/join

(2)将解压后的Android SDK中的libs文件夹拷贝到自己项目中

(3)修改AndroidManifest.xml文件,添加以下内容

添加权限:

<!-- 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" />
在application中添加push service

<!-- push service start -->
<!-- 用于接收系统消息以保证PushService正常运行 -->
<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>
<!-- Push服务接收客户端发送的各种请求-->
<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>
<!-- 4.4版本新增的CommandService声明,提升小米和魅族手机上的实际推送到达率 -->
<service android:name="com.baidu.android.pushservice.CommandService"
android:exported="true" />
<!-- push结束 -->


(4)在MainActivity中添加以下代码

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
/*最后一个参数为api_key,将自己创建的应用生成的api-key复制过来*/
PushManager.startWork(getApplicationContext(),PushConstants.LOGIN_TYPE_API_KEY,"3bDa94fqBVGQ20gReLvZWbAZ");

}


(5)创建PushTestReceiver类,继承PushMessageReceiver,并在AndroidManifest文件中注册

/*
* 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 PushTestReceiver extends PushMessageReceiver {
/** TAG to Log */
public static final String TAG = PushTestReceiver.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);
}

/**
* 接收透传消息的函数。
*
* @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);

}

/**
* 接收通知点击的函数。
*
* @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);

}

/**
* 接收通知到达的函数。
*
* @param context
*            上下文
* @param title
*            推送的通知的标题
* @param description
*            推送的通知的描述
* @param customContentString
*            自定义内容,为空或者json字符串
*/

@Override
public void onNotificationArrived(Context context, String title,
String description, String customContentString) {

String notifyString = "onNotificationArrived  title=\"" + title
+ "\" description=\"" + description + "\" customContent="
+ customContentString;
Log.d(TAG, 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);

}

/**
* 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);

}

/**
* 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);

}

/**
* 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);

}

}


<!-- 注册自己的Receiver-->
<receiver android:name="com.baidu.push.example.PushTestReceiver">
<intent-filter>
<!-- 接收push消息 -->
<action android:name="com.baidu.android.pushservice.action.MESSAGE" />
<!-- 接收bind、setTags等method的返回结果-->
<action android:name="com.baidu.android.pushservice.action.RECEIVE" />
<!-- 接收通知点击事件,和通知自定义内容 -->
<action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
</intent-filter>
</receiver>


(6)运行程序,在logCat如果输出如下信息表示成功



3.服务端

(1)解压文件,拷贝libs文件夹到自己项目中,并将jar文件build path

(2)从解压文件中给的example中拷贝AndroidPushMsgToAll到项目中,将apikey和secretkey复制过来,修改main函数中的apikey和secretkey.

public class AndroidPushMsgToAll {
public static void main(String[] args)
throws PushClientException,PushServerException {
// 1. get apiKey and secretKey from developer console
String apiKey = "3bDa94fqBVGQ20gReLvZWbAZ";
String secretKey = "jU4rBLw7j0AOpjCETVS1Qx72xER7b5Gu";
PushKeyPair pair = new PushKeyPair(apiKey, secretKey);

// 2. build a BaidupushClient object to access released interfaces
BaiduPushClient pushClient = new BaiduPushClient(pair,
BaiduPushConstants.CHANNEL_REST_URL);

// 3. register a YunLogHandler to get detail interacting information
// in this request.
pushClient.setChannelLogHandler(new YunLogHandler() {
@Override
public void onHandle(YunLogEvent event) {
System.out.println(event.getMessage());
}
});

try {
// 4. specify request arguments
PushMsgToAllRequest request = new PushMsgToAllRequest()
.addMsgExpires(new Integer(3600)).addMessageType(0)
.addMessage("Hello Baidu push") //添加透传消息
.addSendTime(System.currentTimeMillis() / 1000 + 120) // 设置定时推送时间,必需超过当前时间一分钟,单位秒.实例2分钟后推送
.addDeviceType(3);
// 5. http request
PushMsgToAllResponse response = pushClient.pushMsgToAll(request);
// Http请求结果解析打印
System.out.println("msgId: " + response.getMsgId() + ",sendTime: "
+ response.getSendTime() + ",timerId: "
+ response.getTimerId());
} catch (PushClientException e) {
if (BaiduPushConstants.ERROROPTTYPE) {
throw e;
} else {
e.printStackTrace();
}
} catch (PushServerException e) {
if (BaiduPushConstants.ERROROPTTYPE) {
throw e;
} else {
System.out.println(String.format(
"requestId: %d, errorCode: %d, errorMessage: %s",
e.getRequestId(), e.getErrorCode(), e.getErrorMsg()));
}
}
}
}


(3)运行main方法,控制台输出如下信息,android客户端将收到一条推送

URL:[http://api.tuisong.baidu.com/rest/3.0/push/all]
params:[apikey=3bDa94fqBVGQ20gReLvZWbAZ&device_type=3&msg=Hello+Baidu+push&msg_expires=3600&msg_type=0&send_time=1449639409&sign=fb5a837c77944908258077d9ff7feda0×tamp=1449639289]
HttpStatusCode:[200]
Response:[{"request_id":99473142,"response_params":{"msg_id":"6151056986351521603","send_time":"1449639409","timer_id":"7605008479284309731"}}
]

msgId: 6151056986351521603,sendTime: 1449639409,timerId: 7605008479284309731



有时候可能会有延迟,需要过一会儿才能收到推送,也可以直接通过百度云推送控制台向应用发送推送

百度云推送控制台:http://push.baidu.com/console/app

代码下载:http://download.csdn.net/detail/lom9357bye/9350027
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: