推送其实挺中意小米推送的,并经用户群占比还是比较大的,奈何拗不过php后端哥们的选型,就只好用信鸽推送了,期间接入过程中也是遇到不少问题,所以记录下来,以后如果还是用信鸽推送的话,估计看看以前的博客,也能少踩点坑。

因为最新版本是2.43,所以按照2.43的引入为准

1,导入jar包和so文件:

文件夹为信鸽推送必须的so文件:

2,针对so文件,gradle文件进行配置,生成第一张图里面的native_libs2的jar文件:

3,AndroidManifest.xml文件的配置,这个基本按照官网demo文件里面写的就行:

  1. <!--(信鸽推送相关)-->
  2. <!-- 【必须】 (2.30及以上版新增)展示通知的activity -->
  3. <activity
  4. android:name="com.tencent.android.tpush.XGPushActivity"
  5. android:theme="@android:style/Theme.Translucent"
  6. android:exported="false">
  7. <intent-filter>
  8. <!-- 若使用AndroidStudio,请设置android:name="android.intent.action"-->
  9. <action android:name="android.intent.action"/>
  10. </intent-filter>
  11. </activity>
  12.  
  13. <!-- 【必须】 信鸽receiver广播接收 -->
  14. <receiver
  15. android:name="com.tencent.android.tpush.XGPushReceiver"
  16. android:process=":xg_service_v2">
  17. <intent-filter android:priority="0x7fffffff">
  18.  
  19. <!-- 【必须】 信鸽SDK的内部广播 -->
  20. <action android:name="com.tencent.android.tpush.action.SDK"/>
  21. <action android:name="com.tencent.android.tpush.action.INTERNAL_PUSH_MESSAGE"/>
  22. <!-- 【必须】 系统广播:网络切换 -->
  23. <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
  24.  
  25. <!-- 【可选】 系统广播:开屏 -->
  26. <action android:name="android.intent.action.USER_PRESENT"/>
  27.  
  28. <!-- 【可选】 一些常用的系统广播,增强信鸽service的复活机会,请根据需要选择。当然,你也可以添加APP自定义的一些广播让启动service -->
  29. <action android:name="android.bluetooth.adapter.action.STATE_CHANGED"/>
  30. <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
  31. <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
  32. </intent-filter>
  33. <!-- 【可选】 usb相关的系统广播,增强信鸽service的复活机会,请根据需要添加 -->
  34. <intent-filter android:priority="0x7fffffff">
  35. <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
  36. <action android:name="android.intent.action.MEDIA_REMOVED"/>
  37. <action android:name="android.intent.action.MEDIA_CHECKING"/>
  38. <action android:name="android.intent.action.MEDIA_EJECT"/>
  39.  
  40. <data android:scheme="file"/>
  41. </intent-filter>
  42. </receiver>
  43. <!-- 【必须】 信鸽service -->
  44. <service
  45. android:name="com.tencent.android.tpush.service.XGPushService"
  46. android:exported="true"
  47. android:persistent="true"
  48. android:process=":xg_service_v2"/>
  49.  
  50. <!-- 【必须】 通知service,其中android:name部分要改为当前包名 -->
  51. <service
  52. android:name="com.tencent.android.tpush.rpc.XGRemoteService"
  53. android:exported="true">
  54. <intent-filter>
  55. <!-- 【必须】 请修改为当前APP名包.PUSH_ACTION,如demo的包名为:com.qq.xgdemo -->
  56. <action android:name="你的包名.PUSH_ACTION"/>
  57. </intent-filter>
  58. </service>
  59.  
  60. <!-- 【可选】APP实现的Receiver,用于接收消息透传和操作结果的回调,请根据需要添加 -->
  61. <!-- YOUR_PACKAGE_PATH.CustomPushReceiver需要改为自己的Receiver: -->
  62. <receiver
  63. android:name=".push.MessageReceiver"
  64. android:exported="false">
  65. <intent-filter>
  66. <!-- 接收消息透传 -->
  67. <action android:name="com.tencent.android.tpush.action.PUSH_MESSAGE"/>
  68. <!-- 监听注册、反注册、设置/删除标签、通知被点击等处理结果 -->
  69. <action android:name="com.tencent.android.tpush.action.FEEDBACK"/>
  70. </intent-filter>
  71. </receiver>
  72. <!-- 【必须】 请修改为APP的AccessId,“21”开头的10位数字,中间没空格 -->
  73. <meta-data
  74. android:name="XG_V2_ACCESS_ID"
  75. android:value="你的AccessId"/>
  76. <!-- 【必须】 请修改为APP的AccessKey,“A”开头的12位字符串,中间没空格 -->
  77. <meta-data
  78. android:name="XG_V2_ACCESS_KEY"
  79. android:value="你的AccessKey"/>

还有就是相关权限:

  1. <!-- 【必须】 信鸽SDK所需权限 -->
  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_WIFI_STATE" />
  5. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  6. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  7. <uses-permission android:name="android.permission.RESTART_PACKAGES" />
  8. <uses-permission android:name="android.permission.BROADCAST_STICKY" />
  9. <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  10. <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
  11. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  12. <uses-permission android:name="android.permission.WAKE_LOCK" />
  13. <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
  14. <uses-permission android:name="android.permission.GET_TASKS" />
  15. <uses-permission android:name="android.permission.READ_LOGS" />
  16. <uses-permission android:name="android.permission.VIBRATE" />
  17. <!-- 【可选】 信鸽SDK所需权限 -->
  18. <uses-permission android:name="android.permission.BLUETOOTH" />
  19. <uses-permission android:name="android.permission.BATTERY_STATS" />

虽然很多,但是没办法,毕竟是中国特色,推送只能这样,才能勉强能够保证推送到达率。

4,相关代码的集成:

如上其实都是可以从demo文件里面拷贝出来的,其中messageReceiver是最重要的类,因为主要的推送信息是从这个类里面获取的。

  1. public class MessageReceiver extends XGPushBaseReceiver {
  2. private Intent intent = new Intent(
  3. "com.qq.xgdemo.activity.UPDATE_LISTVIEW");
  4. public static final String LogTag = "TPushReceiver";
  5.  
  6. //private void show(Context context, String text) {
  7. // Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
  8. //}
  9.  
  10. // 通知展示,主要控制推送来的信息在状态栏的展示,当然如果想自定义可以修改这个方法
  11. @Override
  12. public void onNotifactionShowedResult(Context context, XGPushShowedResult notifiShowedRlt) {
  13. if (context == null || notifiShowedRlt == null) {
  14. return;
  15. }
  16. XGNotification notific = new XGNotification();
  17. notific.setMsg_id(notifiShowedRlt.getMsgId());
  18. notific.setTitle(notifiShowedRlt.getTitle());
  19. notific.setContent(notifiShowedRlt.getContent());
  20. // notificationActionType==1为Activity,2为url,3为intent
  21. notific.setNotificationActionType(
  22. notifiShowedRlt.getNotificationActionType());
  23. // Activity,url,intent都可以通过getActivity()获得
  24. notific.setActivity(notifiShowedRlt.getActivity());
  25. notific.setUpdate_time(
  26. new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(
  27. Calendar.getInstance().getTime()));
  28. NotificationService.getInstance(context).save(notific);
  29. context.sendBroadcast(intent);
  30. String customContent = notifiShowedRlt.getCustomContent();
  31. KLog.json(customContent);
  32. }
  33.  
  34.   //反注册,注意在你用的activity里面的ondestory里面反注册
  35. @Override public void onUnregisterResult(Context context, int errorCode) {
  36. KLog.i("onUnregisterResult");
  37. if (context == null) {
  38. return;
  39. }
  40. String text = "";
  41. if (errorCode == XGPushBaseReceiver.SUCCESS) {
  42. text = "反注册成功";
  43. }
  44. else {
  45. text = "反注册失败" + errorCode;
  46. }
  47. KLog.i(LogTag, text);
  48. //show(context, text);
  49. }
  50.  
  51. @Override
  52. public void onSetTagResult(Context context, int errorCode, String tagName) {
  53. KLog.i("onSetTagResult");
  54. if (context == null) {
  55. return;
  56. }
  57. String text = "";
  58. if (errorCode == XGPushBaseReceiver.SUCCESS) {
  59. text = "\"" + tagName + "\"设置成功";
  60. }
  61. else {
  62. text = "\"" + tagName + "\"设置失败,错误码:" + errorCode;
  63. }
  64. Log.d(LogTag, text);
  65. //show(context, text);
  66. }
  67.  
  68. @Override
  69. public void onDeleteTagResult(Context context, int errorCode, String tagName) {
  70. KLog.i("onDeleteTagResult");
  71. if (context == null) {
  72. return;
  73. }
  74. String text = "";
  75. if (errorCode == XGPushBaseReceiver.SUCCESS) {
  76. text = "\"" + tagName + "\"删除成功";
  77. }
  78. else {
  79. text = "\"" + tagName + "\"删除失败,错误码:" + errorCode;
  80. }
  81. Log.d(LogTag, text);
  82. //show(context, text);
  83. }
  84.  
  85. // 通知点击回调 actionType=1为该消息被清除,actionType=0为该消息被点击
  86. @Override
  87. public void onNotifactionClickedResult(Context context, XGPushClickedResult message) {
  88. KLog.i("onNotifactionClickedResult");
  89. if (context == null || message == null) {
  90. return;
  91. }
  92. String text = "";
  93. if (message.getActionType() ==
  94. XGPushClickedResult.NOTIFACTION_CLICKED_TYPE) {
  95. // 通知在通知栏被点击啦。。。。。
  96. // APP自己处理点击的相关动作
  97. // 这个动作可以在activity的onResume也能监听,请看第3点相关内容
  98. text = "通知被打开 :" + message;
  99. KLog.i(text);
  100.  
  101. KLog.i(message.getActivityName());
  102. // 获取自定义key-value,我们的app主要的根据这块的内容进行控制的,所以主要处理这块的代码
  103. String customContent = message.getCustomContent();
  104. if (!StringUtil.isEmpty(customContent)) {
  105. KLog.i("customContent", customContent);
  106. PushResult pushResult = Json.get()
  107. .toObject(customContent,
  108. PushResult.class);
  109. switch (pushResult.getIndex()) {
  110. //......你的业务处理代码default:
  111. break;
  112. }
  113. }
  114. }
  115. else if (message.getActionType() ==
  116. XGPushClickedResult.NOTIFACTION_DELETED_TYPE) {
  117. // 通知被清除啦。。。。
  118. // APP自己处理通知被清除后的相关动作
  119. text = "通知被清除 :" + message;
  120. KLog.i(text);
  121. }
  122. }
  123.  
  124. @Override
  125. public void onRegisterResult(Context context, int errorCode, XGPushRegisterResult message) {
  126. KLog.i("onRegisterResult");
  127. // TODO Auto-generated method stub
  128. if (context == null || message == null) {
  129. return;
  130. }
  131. String text = "";
  132. if (errorCode == XGPushBaseReceiver.SUCCESS) {
  133. text = message + "注册成功";
  134. // 在这里拿token
  135. String token = message.getToken();
  136. }
  137. else {
  138. text = message + "注册失败,错误码:" + errorCode;
  139. }
  140. Log.d(LogTag, text);
  141. //show(context, text);
  142. }
  143.  
  144. // 消息透传
  145. @Override
  146. public void onTextMessage(Context context, XGPushTextMessage message) {
  147. KLog.json(Json.get().toJson(message));
  148. // TODO Auto-generated method stub
  149. String text = "收到消息:" + message.toString();
  150. // 获取自定义key-value
  151. String customContent = message.getCustomContent();
  152. if (customContent != null && customContent.length() != 0) {
  153. try {
  154. JSONObject obj = new JSONObject(customContent);
  155. // key1为前台配置的key
  156. if (!obj.isNull("key")) {
  157. String value = obj.getString("key");
  158. Log.d(LogTag, "get custom value:" + value);
  159. }
  160. // ...
  161. } catch (JSONException e) {
  162. e.printStackTrace();
  163. }
  164. }
  165. // APP自主处理消息的过程...
  166. Log.d(LogTag, text);
  167. //show(context, text);
  168. }
  169. }

android app 集成 信鸽推送的更多相关文章

  1. QtAndroid具体解释(6):集成信鸽推送

    推送是我们开发移动应用经经常使用到的功能,Qt on Android 应用也会用到,之前也有朋友问过,这次我们来看看怎么在 Qt on Android 应用中来集成来自腾讯的信鸽推送. 有关信鸽的 S ...

  2. 1、Android Studio集成极光推送(Jpush) 报错 java.lang.UnsatisfiedLinkError: cn.jpush.android.service.PushProtoco

    Android studio 集成极光推送(Jpush) (华为手机)报错, E/JPush: [JPushGlobal] Get sdk version fail![获取sdk版本失败!] W/Sy ...

  3. App集成极光推送步骤

    一.准备: 1.1注册极光开发者账号 1.2添加应用,获取AppKey 1.3下载提供的demo,demo中的AppKey已自动生成为你自己的AppKey 二.集成: 2.1第一种方式:自动集成 Mo ...

  4. App集成极光推送开发流程[关键步骤]

    1.客户端集成SDK 1.1初始化 JPushInterface.setDebugMode(true); // 设置开启日志,发布时请关闭日志 JPushInterface.init(this); / ...

  5. Android开发 集成极光推送中的问题

    AndroidManifest.xml清单文件报错: cn.jpush.android.service.DataProvider@exported value=(true)报错,解决如下: 根据报错行 ...

  6. Xamarin.Forms学习系列之Android集成极光推送

    一般App都会有消息推送的功能,如果是原生安卓或者IOS集成消息推送很容易,各大推送平台都有相关的Sample,但是关于Xamarin.Forms的消息推送集成的资料非常少,下面就说下Xamarin. ...

  7. Android 信鸽推送通知栏不显示推送的通知

    使用信鸽推送,却怎么也没反应.经过查看log发现确实是收到了推送过来的消息了,其中有这么一行: W/dalvikvm(23255): VFY: unable to resolve virtual me ...

  8. react-native 信鸽推送集成

    目录 一. git链接: react-native-xinge-push 1.1 安装 1.2. link 二. android配置 2.1. android/settings.gradle 2.2. ...

  9. Android集成极光推送

    要说学习极光推送,个人感觉官方文档就非常好啦,但是没法,人太懒啦,为了下次能够快速的将极光推送集成到项目中,故结合之前开发的项目和官方文档记录下简单的Android集成极光推送,在这之前,先上一张简单 ...

随机推荐

  1. 在code first结构下的生成的数据迁移文件,upadate-database失败

    程序控制台出现 already exist Table "xxx",是由于项目中的Migrations(迁移文件)与连接的mysql数据库里迁移记录表里的数量及名称不一致.

  2. C语言之数组

    数组 数组就是在内存空间中,开辟一个大的空间,然后再将这个大的空间均的分为若干份的小空间,每个小空间用来保存一个数据. 1). 数组的专业术语: 长度:指的能存放数据的个数 下标/索引:每一个数据所在 ...

  3. C语言之字符集、ASCII码和sizeof运算符

    一 字符集和ASCII码 结论:字符本质上也是一个整数,每个字符都有唯一一个与之对应的整数, 比如说小写的a对应97,b对应98,c对应99,大写的A对应65,B对应66,C对应67 所以字符对应的那 ...

  4. Oracle-11g 中创建物化视图

    html,body { font-size: 15px } body { font-family: Helvetica, "Hiragino Sans GB", "微软雅 ...

  5. springmvc中返回页面,只在iframe中跳转,而不是整个页面,解决方法。

    问题描述:在我写的主页面中用到了iframe,其中在iframe中有一个button点击提交,然后在Controller中返回页面的时候,是在iframe中打开的,而不是整个页面. 最开始我想用aja ...

  6. CodeForces 645C Enduring Exodus

    枚举,三分. 首先,这$n+1$个人一定是连续的放在一起的.可以枚举每一个起点$L$,然后就是在$[L,R]$中找到一个位置$p$,使得$p4最优,因为越往两边靠,距离就越大,在中间某位置取到最优解, ...

  7. 创建TreeView控件

    第一种方式 hwndTreeView=CreateWindow("SysTreeView32", NULL,WS_CHILD|WS_VISIBLE|TVS_HASLINES|TVS ...

  8. 50道java线程面试题

    50道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序 ...

  9. python自动化开发-1

    1.python简介 python是一门简明并且强大的面向对象的开发语言,已经在WEB开发,软件开发,科学计算,大数据分析,自动化运维等领域得到了广泛的应用. 注意:所有测试均已python3为主,与 ...

  10. Android学习笔记(三)Android开发环境的搭建

    一.配置JAVA环境 二.配置Android开发环境 可以安装adt-bundle-windows,该压缩包一般自带Eclipse.或者安装Android Studio,要注意SDK的版本是否符合要求 ...