android 小米,华为,百度Push封装(准备阶段)

前:本文为QiaoJim原创,转载请附原文链接,谢谢合作!

http://blog.csdn.net/qiao_jim/article/details/73146673


----------------------------------------------------------------------------------

跟着老师做一个餐饮类项目时,APP端其中一个需求,最终定的完成方案是:使用第三方消息推送来向用户推送消息,
如周围的美食,新店家,优惠活动等。其实第三方消息push服务很多,为了提高推送到达率,我们用的思路是:
小米手机用小米push,华为手机用华为push,其他类型的手机用百度push。
我是负责完成push服务这块的工作,所以为了最后在APP项目里方便调用,就将小米,华为,百度3个push服务整合了一下。

封装后的QJPushService,可以获取用户手机的 IMEI 号,作为推送目标用户的唯一标示。开发者也可取消该默认模式,
自定义设置标签等。用户实现3个接口,即可拿到推送的消息,监听用户的通知栏点击和错误回调。

本篇博客主要介绍如何快速接入小米,华为和百度这3方的SDK,属于准备阶段。具体使用详见后续博文。
关于3个push服务推送的详细使用,大家可以去开发者官网查看文档。

jar包下载地址QJPushManager_1.1.jar (在我github项目的 /app 目录下)

一、快速接入步骤

1、导入SDK,同步
---- 最终结果 ----

---- 小米push部分 ----
导入jar到libs目录下

---- 华为push部分 ----
创建 aars 目录,并把 HMS-SDK-{version}.aar 复制到此 aars目录
添加 android-support-v4 依赖
修改 build.gradle 文件,加入上图标注的配置信息,注意SDK版本号的一致

---- 百度push部分 ----
解压SDK,进入 libs 文件夹。
如果您的工程中没有其他的.so文件,建议只拷贝armeabi文件夹。
如果您的工程中还使用了其他的.so文件,只需要拷贝对应目录下的.so文件即可。
如果使用Android Stutio,在工程中“src/main”目录中新建名为jniLibs的目录(如上图),
将下载的SDK的libs文件夹中文件拷贝到“jniLibs”目录内。
如果使用Eclipse,将解压后的libs文件夹中所有文件拷贝到您的工程的libs文件夹中。


2、复制下面的权限信息到你项目的 AndroidManifest.xml 文件中,简单复制粘贴即可
注意:查找替换所有的 YourPackageName 为实际开发的项目包名即可

<!-- QJPushService 需要的权限 -->

<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.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.GET_TASKS" />

<!-- 华为push -->
<uses-permission android:name="android.permission.WAKE_LOCK" />

<!-- 小米推送需要声明的权限 -->
<!-- 修改  YourPackageName  需要使用实际项目的包名 -->
<permission
    android:name="YourPackageName.permission.MIPUSH_RECEIVE"
    android:protectionLevel="signature" />
<!-- 修改  YourPackageName  需要使用实际项目的包名 -->
<uses-permission android:name="YourPackageName.permission.MIPUSH_RECEIVE" />

<!-- 百度   富媒体需要声明的权限 -->
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
<!-- 百度   适配Android N系统必需的ContentProvider写权限声明 -->
<!-- 修改  YourPackageName  需要使用实际项目的包名 -->
<uses-permission android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.YourPackageName" />
<!-- 修改  YourPackageName  需要使用实际项目的包名 -->
<permission
    android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.YourPackageName"
    android:protectionLevel="normal" />

<!-- QJPushService 需要的权限 end -->



3、添加注册信息到 AndroidManifest.xml 的 application节点下,复制粘贴下方给出的代码即可(哈哈,注意看下说明)

说明:
(1)修改 YourPackageName 为实际项目包名,修改 AppId 和 ApiKey 为具体值,详见对应注释;
(2)如果开发者有需要在不同时期的回调函数中,自定义处理逻辑,需要自定义push的回调类,
删除 QJPushService 内置的默认 receiver 注册;
(3)如果华为push配置时飘红,添加下面的字符串声明到string.xml
<string name="hwpush_ability_value" translatable="false">successRateAnalytics</string> 


------- 小米push注册信息 ------

<!-- 小米推送 -->

<!-- 小米push 开发者自定义 receiver 声明,继承 PushMessageReceiver -->
<receiver
    android:name=".mi.MiPushReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.xiaomi.mipush.ERROR" />
    </intent-filter>
</receiver>
<!-- 小米push 开发者自定义 receiver 声明 end -->
<service
    android:name="com.xiaomi.push.service.XMJobService"
    android:enabled="true"
    android:exported="false"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:process=":pushservice" />
<service
    android:name="com.xiaomi.push.service.XMPushService"
    android:enabled="true"
    android:process=":pushservice" />
<service
    android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
    android:enabled="true"
    android:exported="true" />
<service
    android:name="com.xiaomi.mipush.sdk.MessageHandleService"
    android:enabled="true" />

<receiver
    android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>
<receiver
    android:name="com.xiaomi.push.service.receivers.PingReceiver"
    android:exported="false"
    android:process=":pushservice">
    <intent-filter>
        <action android:name="com.xiaomi.push.PING_TIMER" />
    </intent-filter>
</receiver>

<!-- 小米推送 end -->



------- 华为push注册信息 ------

<!-- 华为推送 -->

<!-- value 修改为实际申请的华为app id -->
<meta-data
    android:name="com.huawei.hms.client.appid"
    android:value="AppId"/>
<!-- 修改 authorities 中 YourPackageName  需要使用实际项目的包名 -->
<provider
    android:name="com.huawei.hms.update.provider.UpdateProvider"
    android:authorities="YourPackageName.hms.update.provider"
    android:exported="false"
    android:grantUriPermissions="true"/>

<!-- 华为push  开发者自定义 receiver 声明,继承 PushReceiver -->
<receiver android:name=".huawei.HuaweiPushReceiver">
    <intent-filter>

        <!-- 必须,用于接收token -->
        <action android:name="com.huawei.android.push.intent.REGISTRATION" />
        <!-- 必须,用于接收消息 -->
        <action android:name="com.huawei.android.push.intent.RECEIVE" />
        <!-- 可选,用于点击通知栏或通知栏上的按钮后触发onEvent回调 -->
        <action android:name="com.huawei.android.push.intent.CLICK" />
        <!-- 可选,查看push通道是否连接,不查看则不需要 -->
        <action android:name="com.huawei.intent.action.PUSH_STATE" />
    </intent-filter>
    <!-- 添加 <string name="hwpush_ability_value" translatable="false">successRateAnalytics</string> 到string.xml -->
    <meta-data
        android:name="CS_cloud_ablitity"
        android:value="@string/hwpush_ability_value" />
</receiver>
<!-- 华为push  开发者自定义 receiver 声明 end -->

<receiver android:name="com.huawei.hms.support.api.push.PushEventReceiver">
    <intent-filter>

        <!-- 接收通道发来的通知栏消息,兼容老版本Push -->
        <action android:name="com.huawei.intent.action.PUSH" />
    </intent-filter>
</receiver>
<!-- 华为部分end -->


<!-- 华为推送 end -->



------- 百度push注册信息 ------

<!-- 百度推送 -->

<!-- value 填写实际申请的百度 api key -->
<meta-data
    android:name="api_key"
    android:value="ApiKey" />

<!-- 百度push 开发者自定义 receiver 声明,继承 PushReceiver -->
<receiver android:name=".baidu.BaiduPushReceiver">
    <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>
<!-- 百度push 开发者自定义 receiver 声明 end -->

<!-- 适配Android N系统必需的ContentProvider声明,写权限包含应用包名 -->
<!-- 修改  YourPackageName  需要使用实际项目的包名 -->
<provider
    android:name="com.baidu.android.pushservice.PushInfoProvider"
    android:authorities="YourPackageName.bdpush"
    android:exported="true"
    android:protectionLevel="signature"
    android:writePermission="baidu.push.permission.WRITE_PUSHINFOPROVIDER.YourPackageName" />
<!-- push富媒体,使用富媒体推送必须声明 -->
<activity
    android:name="com.baidu.android.pushservice.richmedia.MediaViewActivity"
    android:configChanges="orientation|keyboardHidden"
    android:label="MediaViewActivity" />
<activity
    android:name="com.baidu.android.pushservice.richmedia.MediaListActivity"
    android:configChanges="orientation|keyboardHidden"
    android:label="MediaListActivity"
    android:launchMode="singleTask" />
<!-- 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" />

<!-- 百度推送 end -->


4、以上完成后,可使用QJPushService完成消息推送了
具体使用详见我的下一篇博文  android 小米,华为,百度推送封装(QJPushService 使用)
jar包下载地址  QJPushManager_v170828.jar

二、小米,华为,百度手机测试效果图

            

                    

            

猜你喜欢

转载自blog.csdn.net/Qiao_Jim/article/details/73146673
今日推荐