Android客户端常见问题汇总

1. Android怎么打开云推送的调试模式?

有两种方式打开调试模式:

  • 使用云推送检测工具DetectToolsForDeveloper打开(下载地址:http://push.baidu.com/static/downloads/DetectToolsForDeveloper.apk ),该工具打开的是当前pushservice正在运行应用的debug开关,若您的应用不是,请使用方法二;
  • 代码打开,在代码中调用PushManager.StartWork之前加上PushSettings.enableDebugMode(context, true);

2. Android应用调用startWork绑定不成功(即onbind回调信息中errorcod不为0)怎么办?

  • 首先请确保集成的sdk版本是官网最新的版本,新版本对绑定逻辑做了优化,进一步提升绑定成功率。
  • 如果errorcode=10101,表示集成错误,请用DetectTools工具检查一下集成方式是否正确,如不正确参照修改建议修改;如未有错误提示,请打开调试模式(打开方法参考问题1),跟一下相关日志,根据日志提示进行修改。(常见集成错误问题:so文件集成不正确、manifest文件必须权限声明不正确、apikey填写不正确等)
  • 如果errorcode=10001,表示网络问题,请检查手机网络连接是否正常。注意如果是小米MIUI7.0及以上的系统手机,因增加不允许后台服务长时间联网特性,请如下操作:设置-其他高级设置-电量和性能-神隐模式-关闭,就可以正常绑定和接收消息。
  • 如果是其他错误码,请参考云推送官网或者用户手册中“错误码说明”进行相关问题排查。
  • 如以上步骤仍不能解决问题,联系开发者群云推送技术客服协助解决问题。

3. Android应用绑定成功(onbind返回的errorcode为0)后,推送消息收不到,怎么办?

  • 请确保集成的sdk版本是官网最新的版本。
  • 请确认控制台或者server api推送是否成功推送,如没有推送成功,请根据对应的错误提示进行问题排查。
  • 请使用DetectTools工具检查设备的pushservice和长连接是否正常。如不正常后台抹掉应用再重新startWork绑定一下即可建立(pushservice有多种保活措施,此方法为其中一种),如无法建立请检查是否是以下特殊机型:
    (1)如果是华为EMUI4.0及以上系统手机,因增加关联启动机制,请如下操作:设置—权限管理—关联启动—打开pushservice优先级最高的应用(用DetectTools工具查看priority值)和自己应用的启动开关,然后把优先级最高的应用启动一下,pushservice就会建立起来,就可以正常绑定和接收消息。(已和华为厂商协商,后续版本会完全兼容)
    (2)如果是小米MIUI7.0及以上的系统手机,因增加不允许后台服务长时间联网特性,请如下操作:设置-其他高级设置-电量和性能-神隐模式-关闭,然后把优先级最高的应用启动一下,pushservice就会建立起来,就可以正常绑定和接收消息。(已和小米厂商协商,后续版本会完全兼容)
    (3)如果是三星部分5.0及以上系统新机型,因为增加了“自动运行”权限管理,应用在首次安装时,会弹出应用的权限管理提示,“自动运行”权限默认是关闭状态,这种情况下,非pushservice优先级最高的应用会出现绑定无回调信息返回情况,请如下操作:在三星自带的app 智能管理器 中找到:智能管理器->内存->自启动应用程序->打开pushservice优先级最高的应用(在群文件下载DetectTools工具查看priority值)和自己应用的“自动运行”开关,然后把优先级最高的应用启动一下,pushservice就会建立起来,就可以正常绑定和接收消息。
    (4)如果是魅族Flyme5及以上系统手机,因增加主动防御机制,请如下操作:手机管家-权限管理-自启动管理-相互启动-打开pushservice优先级最高的应用(用DetectTools工具查看priority值)和自己应用的相互启动开关,然后把优先级最高的应用启动一下,pushservice就会建立起来,就可以正常绑定和接收消息。
  • 下载云推送官网PushDemo试一下,是否能正常绑定并接收到消息。
  • 如以上步骤仍不能解决问题,请提供机型、rom、appid、channelid、推送的requestid或者msgid、推送时间等信息,联系云推送技术客服协助解决问题。

4. 使用DetectTools检测工具检测,提示“未检测到后台有pushservice运行!”怎么办?

  • pushservice和长连接有时候出现断开是正常现象,pushsdk有多种保活措施,大部分Android设备上pushservice可以通过用户事件和系统事件自启。小米、魅族等部分特殊机型需要打开应用调用startWork接口pushservice才能自启(如果开启了应用的自启动开关则同样可以保活自启)。
  • 可以通过以下方法快速启动pushservice:调用startWork接口进行绑定,绑定成功后即可建立。

5. 使用DetectTools检测工具检测长连接状态,提示“长连接断开”怎么办?

  • 请先检查当前设备的pushservice是否在正常运行(点击“Push运行在哪个应用中”,或者“检查一条龙”),如果没有pushservice在运行,请参考上一个问题的解决步骤。
  • 如果当前的pushservice在运行,那么每个心跳时间会主动去建立长连接。也可以通过以下两种方法快速建立长连接:一是后台抹掉应用再重新startWork绑定一下即可建立;二是先解绑应用再重新绑定即可建立。

6. 使用DetectTools检测工具检测,显示push运行在别的应用上怎么办?

  • 这个是正常现象,只要设备上pushservice和长连接正常,不管pushservice运行在哪个应用上,其他应用都能正常接收消息。
  • 因为pushsdk是单实例模式,一台设备上只有一个pushservice在运行,从而达到节省手机资源和电量的目的,pushservice运行在优先级最高的应用上面,应用的优先级是sdk内部生成的,sdk版本越高优先级会越高。

7. 通知和透传消息的区别是什么?

msg_type=0表示透传消息,默认没有声音,也不上通知栏,消息收到后会进入到onMessage()回调方法中,后续逻辑由应用自行控制;msg_type=1表示通知,默认有声音,会直接在通知栏弹出展示,通知收到后会进入到onNotificationArrived()回调方法中,开发者也可以自定义样式和行为。

8. 自定义样式怎么用?

自定义样式使用方法如下:

  • 需要在客户端定义样式的属性(通知图标,声音等)和ID,具体操作可参考PushDemo。
  • 控制台消息推送的高级样式里面,通知样式选择自定义样式,并在自定义样式里写入客户端定义好的ID。如果使用的是server api进行推送,请参考:http://push.baidu.com/doc/restapi/msg_struct

9. 自定义行为怎么用?

自定义行为可通过以下两种方式实现:

  • 使用控制台推送,您可以在自定义动作中填入您想要用户在点击后执行的动作,Android端SDK会把填入的字符串转换成Android Intent,通过该Intent打开对应app组件,所以填入的字符串格式必须遵循Android Intent uri格式,最简单的方法可以通过Intent方法toURI()获取, 在自定义行为里写入:

    intent:#Intent;action=com.baidu.push.example.Login;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=com.baidu.push.example/.LoginActivity;end
    并在AndroidManifest里LoginActivity的声明里加上:

    <intent-filter>
      <action android:name="com.baidu.push.example.Login" />
    </intent-filter>
    

    填入以上动作后,用户就可以在点击后自动打开PushDemo的LoginActivity页面(参考下http://push.baidu.com/issue/view/1988 )。

  • 使用SDK推送,您需要把open_type设置为2,在pkg_content参数里写入想要用户在点击后执行的动作(参考Android通知格式:http://push.baidu.com/doc/restapi/msg_struct )。

10. 附加字段怎么使用?

附加字段使用方法如下:

  • 只有Android的通知支持附加字段,您可以在推送通知时在附加字段里写入您自定义的mykey和myvalue的值。
  • 在 PushMessageReceiver 类里的 onNotificationArrived(通知到达) 和 onNotificationClicked(通知点击) 方法里面,您可以获取附加字段里的mykey和myvalue的值(具体请参考官网PushDemo,自定义的内容在customContentString里获取)。

11. 通知图标为什么是白色的方块?

如果您的Android工程使用的是Android API level 21及以上的版本,您的通知图标背景必须是透明的,否则在Android5.0及以上的机器上通知图标可能会变成白色的方块。所以该问题有两种解决方案:一是把您的工程的targetSdkVersion设置成21以下;二是修改您的应用的图标为透明背景的。

12. 应用关闭或结束进程后,还能收到推送吗?

应用退至后台或结束进程,百度云推送的Service会继续在后台运行并接收推送;部分情况下使用安全软件或内存管理工具强制清理后台,Service会被清除,但Push有多种保活机制,会快速重启;在小米和魅族手机上,用户清理后台应用后必须要等到再次打开任意一个集成了PushSDK的app、调用StartWork之后,Service才会在后台启动并继续接收推送。

13. 消息到达后怎么控制跳转到Activity?

有两种方式实现:

  • 客户端控制,在接收消息的Receiver里消息点击的回调方法onNotificationClicked里使用代码控制跳转,具体实现可以参考官网PushDemo;
  • 服务端控制,使用自定义行为控制跳转,具体使用方法参考问题9。

14. 手机上同时安装了多个集成了pushsdk的应用会存在冲突吗?

不存在冲突。如果出现手机上有某个应用时收不到消息,卸载后能收到消息的现象,是因为部分特殊机型的限制因素,详情请参考问题3中关于特殊机型的说明及解决办法。