zoukankan      html  css  js  c++  java
  • App之百度云推送

    集成SDK

    下载最新的Android SDK压缩包并解压,在新建工程或已有工程中增加百度云推送功能。
    我下载的是

    ,里面有一个同名的文件夹,文件夹中有

     

    导入云推送jar包和so文件:

    将解压后的libs文件夹中所有文件拷贝到您的工程的libs文件夹中。如果您的工程中没有其他的.so文件,建议只拷贝armeabi文件夹。如果您的工程中还使用了其他的.so文件,只需要拷贝对应目录下的.so文件即可。如果你使用的Android开发环境是Android Stutio,在工程中“src/main”目录中新建名为jniLibs的目录,将libs文件夹中文件拷贝到“jniLibs”目录内。 

    将解压后的libs中的文件拷贝到工程libs中对应的目录中,没有目录的话,直接拷贝目录。

    其中用红线框住的是从SDK压缩包中拷贝到工程中的,其他的文件或目录都是工程原有的。

    配置AndroidManifest文件:

    在当前工程的AndroidManifest.xml文件中,添加权限和声明信息:

     1 <!-- Push service 运行需要的权限 -->
     2 <uses-permission android:name="android.permission.INTERNET" />
     3 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     4 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
     5 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     6 <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     7 <uses-permission android:name="android.permission.VIBRATE" />
     8 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     9 <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
    10 <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
    11 <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    12 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    13 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    14 <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
    15 
    16 <!-- !!!!!下面的标签要放在application标签内!!!!! -->
    17 <!-- 4.6版本新增的Activity声明,提升Push后台存活率 -->
    18 <activity
    19     android:name="com.baidu.android.pushservice.PushKeepAlive"
    20     android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
    21 
    22 <!-- push service start -->
    23 <!-- 用于接收系统消息以保证PushService正常运行 -->
    24 <receiver android:name="com.baidu.android.pushservice.PushServiceReceiver"
    25     android:process=":bdservice_v1" >
    26     <intent-filter>
    27         <action android:name="android.intent.action.BOOT_COMPLETED" />
    28         <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    29         <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
    30         <action android:name="com.baidu.android.pushservice.action.media.CLICK" />
    31         <!-- 以下四项为可选的action声明,可大大提高service存活率和消息到达速度 -->
    32         <action android:name="android.intent.action.MEDIA_MOUNTED" />
    33         <action android:name="android.intent.action.USER_PRESENT" />
    34         <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
    35         <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
    36     </intent-filter>
    37 </receiver>
    38 <!-- Push服务接收客户端发送的各种请求-->
    39 <receiver android:name="com.baidu.android.pushservice.RegistrationReceiver"
    40     android:process=":bdservice_v1" >
    41     <intent-filter>
    42         <action android:name="com.baidu.android.pushservice.action.METHOD" />
    43         <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
    44     </intent-filter>
    45     <intent-filter>
    46         <action android:name="android.intent.action.PACKAGE_REMOVED" />
    47         <data android:scheme="package" />
    48     </intent-filter>                   
    49 </receiver>
    50 <service android:name="com.baidu.android.pushservice.PushService" android:exported="true" 
    51     android:process=":bdservice_v1" >
    52     <intent-filter >
    53             <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />
    54     </intent-filter>
    55 </service>
    56 <!-- 4.4版本新增的CommandService声明,提升小米和魅族手机上的实际推送到达率 -->
    57 <service android:name="com.baidu.android.pushservice.CommandService"
    58     android:exported="true" />
    59 <!-- push结束 -->
     

    启动云推送

    在当前工程的主Activity的onCreate函数中,添加以下代码:

    PushManager.startWork(getApplicationContext(),PushConstants.LOGIN_TYPE_API_KEY,"api_key")

    其中的“API Key“需要手动修改为指定应用的API Key。

    自定义回调类

    在当前工程中新建一个PushTestReceiver类(类名可以是其他任意),该类要继承PushMessageReceiver,并重载所有的回调函数:

    代码如下:

    在当前工程的AndroidManifest.xml文件中,添加自定义Receiver信息如下:

    <!-- 此处Receiver名字修改为当前包名路径 -->
    <receiver android:name="com.*.*.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>

    运行App

    右键点击当前工程,选择Run As --> Android Application,选中已连接的设备或Android虚拟机,运行该程序。如果在logcat中的回调函数中的errorCode为0,说明已经绑定成功,并返回userid和channelid,我们就可以在云控制台推送通知和透传消息到该app了。

     

    !!!以上仅仅是做好了接收端(客户端)的接受配置,表示可以接收百度云推送的消息了,下面要进行真正的消息推送了。

    推送消息

    在集成SDK后,可以通过以下两种方式推送消息。

    通过控制台推送消息:

    1、在百度云推送控制台 http://push.baidu.com/console/app 中创建应用,并进行应用配置

    2、进入应用管理,API KEY等都是从里面找到的。

    3、推送列表

    4、点击重发。(注意:推送成功并不表示手机就收到了消息通知,只有到达数+1时,才表示有手机收到了该通知)

     

    通过服务端SDK推送消息(目前服务端提供 java和php 两种语言的SDK,以下是java代码):

      在百度云推送上下载java服务端的SDK http://push.baidu.com/sdk/push_server_sdk_for_java

      

    下面是AndoridPushMsgToAll.java的代码,仅供参考,具体的解释请看官方文档http://push.baidu.com/doc/java/api,写的很好。

     1 package com.baidu.yun.push.sample;
     2 
     3 import com.baidu.yun.core.log.YunLogEvent;
     4 import com.baidu.yun.core.log.YunLogHandler;
     5 import com.baidu.yun.push.auth.PushKeyPair;
     6 import com.baidu.yun.push.client.BaiduPushClient;
     7 import com.baidu.yun.push.constants.BaiduPushConstants;
     8 import com.baidu.yun.push.exception.PushClientException;
     9 import com.baidu.yun.push.exception.PushServerException;
    10 import com.baidu.yun.push.model.PushMsgToAllRequest;
    11 import com.baidu.yun.push.model.PushMsgToAllResponse;
    12 
    13 public class AndroidPushMsgToAll {
    14     public static void main(String[] args) 
    15             throws PushClientException,PushServerException {
    16         /* 1. 创建PushKeyPair
    17          *     用于app的合法身份认证
    18          *     apikey和secretKey可在应用详情中获取
    19          */
    20         String apiKey = "MmPl80nW1RbeCAOT4rcNBGTu";
    21         String secretKey = "QTWsFfuqFlL0RHfvP6tXoV4AndhF49W2";
    22         PushKeyPair pair = new PushKeyPair(apiKey, secretKey);
    23 
    24         // 2. 创建BaiduPushClient,访问SDK接口
    25         BaiduPushClient pushClient = new BaiduPushClient(pair,
    26                 BaiduPushConstants.CHANNEL_REST_URL);
    27 
    28         // 3. 注册YunLogHandler,获取本次请求的交互信息
    29         pushClient.setChannelLogHandler(new YunLogHandler() {
    30             @Override
    31             public void onHandle(YunLogEvent event) {
    32                 System.out.println(event.getMessage());
    33             }
    34         });
    35 
    36         try {
    37             // 4. 设置请求参数,创建请求实例
    38             PushMsgToAllRequest request = new PushMsgToAllRequest()
    39                     .addMsgExpires(new Integer(3600))//设置消息的有效时间,单位秒,默认3600*5.
    40                     .addMessageType(1)    //设置消息类型,0表示透传消息,1表示通知,默认为0.
    41                     .addMessage("{"title":"TEST","description":"Hello Baidu push!!---!"}") //添加透传消息
    42                     .addSendTime(System.currentTimeMillis() / 1000 + 120) // 设置定时推送时间,必需超过当前时间一分钟,单位秒.实例2分钟后推送
    43                     .addDeviceType(3); //设置设备类型,deviceType => 1 for web, 2 for pc, 3 for android, 4 for ios, 5 for wp.
    44             // 5. 执行Http请求
    45             PushMsgToAllResponse response = pushClient.pushMsgToAll(request);
    46             // 6. Http请求返回值解析
    47             System.out.println("msgId: " + response.getMsgId() + ",sendTime: "
    48                     + response.getSendTime() + ",timerId: "
    49                     + response.getTimerId());
    50         } catch (PushClientException e) {
    51             //ERROROPTTYPE 用于设置异常的处理方式 -- 抛出异常和捕获异常,
    52             //'true' 表示抛出, 'false' 表示捕获。
    53             if (BaiduPushConstants.ERROROPTTYPE) {
    54                 throw e;
    55             } else {
    56                 e.printStackTrace();
    57             }
    58         } catch (PushServerException e) {
    59             if (BaiduPushConstants.ERROROPTTYPE) {
    60                 throw e;
    61             } else {
    62                 System.out.println(String.format(
    63                         "requestId: %d, errorCode: %d, errorMessage: %s",
    64                         e.getRequestId(), e.getErrorCode(), e.getErrorMsg()));
    65             }
    66         }
    67     }
    68 }
    View Code

    其它语言可以通过包装RestAPI使用云推送服务,详情见http://push.baidu.com/doc/restapi/restapi

    手机接收通知消息

    当设备接收到通知消息后,查看手机的通知栏,可以看到通知栏内的新通知展示。如图:

    通知到达时,当通知被用户点击时,会回调onNotificationClicked函数。

     

    注意:百度云推送的频率有限制,限制策略为:单播默认:5000qps,组播默认:100qps,1000qpm,5000qph,广播默认:每4秒只能推送2次

    小米手机可能会出现失败的情况,建议重启一下手机。

  • 相关阅读:
    HDU Problem 1811 Rank of Tetris【拓扑排序+并查集】
    POJ Problem 2367 Genealogical tree【拓扑排序】
    HDU Problem 2647 Reward【拓扑排序】
    HDU Problem 1285 确定比赛名次【拓扑排序】
    HDU Problem HDU Today 【最短路】
    HDU Problem 3665 Seaside【最短路】
    HDU Problem 一个人的旅行 【最短路dijkstra】
    HDU Problem 1596 find the safest road【最短路dijkstra】
    Beyond Compare文本合并进行内容替换要注意什么
    用这些工具都可以比较代码的差异
  • 原文地址:https://www.cnblogs.com/lhat/p/5189403.html
Copyright © 2011-2022 走看看