前:本文为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服务推送的详细使用,大家可以去开发者官网查看文档。
具体使用详见我的下一篇博文android 小米,华为,百度推送封装(QJPushService 使用)
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完成消息推送了
二、小米,华为,百度手机测试效果图