Android常见问题
推送的接口调用问题,请参照移动APP推送SDK使用指南,基本都能在使用指南中找到接口的调用方法,接口的返回值获取,以及异常的一些说明。
本文档主要针对集成指南中没有提到的一些问题进行说明,以便开发能够通过自查,快速解决集成中遇到的一些其他问题。
1. SDK初始化后,调用方法化返回12
隐私协议方法没有被调用,需要在初始化之前调用TH.setAgreePolicy方法,同意隐私协议。
2. SDK初始化后,调用方法返回4
1)查看手机网络是否正常,可以切换到移动网络试下,排查下网络的影响。
2)查看移动APP推送SDK集成是否正确,推送SDK的appkey和secritykey配置是否正确,检查app包名,是否与上传的应用保持一致。
3)如果确认推送SDK集成正常,可以打开移动APP推送的debug开关,看下推送的相关日志。打开debug开关的方法如下: TH.tinvoke(100019, "setDebug", new Class[] { boolean.class }, true);
4)确定下SDK是否调用延迟初始化,如果调用延迟初始化,查看下延迟时间,单位为秒,不是毫秒,请确认下是否正确。
3.发送消息后收不到
1)查看应用的通知栏开关是否打开,如果没有打开,请打开通知栏开关,并重新启动应用。
2)检查手机网络是否正常,可以切换到移动网络测试一下。
3)确认手机当前模式是正常模式,部分手机在低电量、勿扰模式、省电模式下,会对后台进行一系列网络和活动的限制。
4)4.0以上的系统,如果在设置里去掉了显示通知的选项,是展示不出来通知的。
5)目前第三方推送都无法保证关闭应用过后还可以收到推送消息,这个是手机定制ROM的限制问题,一切消息的推送都需要建立在应用service能够正常联网运行的基础上。
6)如果是华为手机,请把应用加入“允许后台运行的程序”。因手机关屏休眠后会杀掉后台不受保护的进程。
7)如果是小米手机,在“设置—通知栏设置---自定义通知”里,可以针对单个应用进行通知栏展示设置,“显示通知栏”关闭后,则不会在通知栏里展示通知消息。
8)小米手机在后台接收不到消息,则需要配置一下:在 安全中心 - 授权管理 - 自启动管理,把应用的自启动打开就可以了。
9)如果是 oppo、vivo等手机需要手动开启通知栏权限,并重新启动应用程序。
4.厂商通道发送消息后收不到
1)所用推送SDK是否为厂商通道版本,如果不是厂商通道版本,请联系商务获取厂商通道版本的推送SDK,官网上现在的SDK,默认是不带厂商通道的。
2)核对自己的手机型号是否为小米,oppo,vivo,华为,魅族五大厂商,只有五大厂商的手机才支持厂商通道,其他的不支持。
3)是否已经将自己申请的每个厂商通道的APPKEY,APPID发给移动APP推送服务端进行配置,如果后台不配置,厂商通道是无法生效的。
4)查看厂商通道的配置文档,是否按照配置文档进行了相关配置,check下配置的信息是否正确。
5)打开debug开关,PUSH_SDK tag下的日志,看是否有 Register [vendor:相关日志,如果没有改日志说明厂商通道注册失败,请联系技术支持人员进行解决。
6)如果是有的厂商可以收到消息,有的厂商收不到消息,可以先通过厂商测提供的问题列表进行排查,一般都能在问题列表中找到存在的问题,如果实在找不到问题,再联系技术支持人员进行解决。厂商通道的问题列表,具体参照1.2章节提供的文档中每个厂商的FAQ。
5)如果厂商通道配置没有问题,但是还是收不到推送消息 首先在初始化方法后,调用如下方法把debug开关打开 TH.tinvoke(100019, "setDebug", new Class[] { boolean.class }, true); 调用如下方法,打印PushUid
TH.tinvoke(100019, "getPushUid",new Callback() {
@Override
public Object onEnd(Object...arg0){
System.out.println(arg0[0]);
return null;
}
@Override
public Object onError(Object...arg0) {
return null;
}
});
最后,将PUSH_SDK TAG下的log信息,appkey,以及getPushUid的返回结果,发给移动APP推送技术支持进行问题定位。
5.华为厂商通道收到消息后点击无反应
这个问题主要原因是在华为厂商通道点击如果配置了有特殊字符的参数,会导致json解析失败,该问题已经在推送SDK3.5.6.0之后的版本中修改,请集成最新版本的SDK即可解决。
6.华为厂商通道打开指定页面,回到后台,页面从最近任务列表中消失
主要问题在HWPushActivity的excuteFromRecentTask为true属性导致,该问题已经在推送SDK3.5.7.2版本以后修改,请集成最新版本的SDK解决。
7.华为,OPPO厂商通道通知栏点击后,应用启动过慢的问题
华为厂商通道:
需宿主在Manifest里面注册代理HWPushActivity信息,需要将代理HWPushActivity的theme替换为宿主LauncherActivity的theme
<activity
android:name="com.baidu.techain.push.HWPushActivity"
android:excludeFromRecents="true"
tools:replace="android:theme"
android:exported="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="com.hw.push"
android:scheme="vendors" />
</intent-filter>
</activity>
OPPO厂商通道:
需宿主在Manifest里面注册代理OPPOPushActivity信息,需要将代理OPPOPushActivity的theme替换为宿主LauncherActivity的theme。
此类问题主要针对宿主的初始化过多,造成应用Activity启动过慢的问题优化。theme替换的意义在于使用宿 主的android:windowBackground来优化展示,请集成方根据具体情况替换。
8.魅族厂商通道无法注册,并出现processMessage error Parcelable
1)编译时要禁用R8优化。
2)魅族厂商通道push消息结构在编译期间被动态修改,导致序列化失败,无法注册成功,如果有在编译期间动态插桩逻辑,请过滤掉魅族厂商通道包下的所有类即可。
9.什么是自定义铃声?自定义铃声怎么用?自定义铃声有什么注意事项?
什么是自定义铃声?
通过预设通知的channel和铃声,达到通知到达客户端的时候,产生不同的声音提醒的效果
移动APP推送支持,自有通道和华为小米的自定义铃声
- push自有通道在线,通过自有通道下发通知,支持自定义通知铃声;
- push自有通道不在线,通过厂商通道下发,华为,小米支持自定义通知铃声,其他厂商不支持使用原有系统铃声;
自定义铃声怎么用?
“自定义通知铃声”接入方式:
- 接入方需提前把自定义的铃声预制在Android App的raw目录下
- 调用移动APP推送openApi接口 传入自定义铃声,字段参见API接口 Android8.0以上存在,NotificationChannel的概念,创建通知渠道后,便无法更改通知行为(铃声,震动方式),此时用户可在设置中修改;
自定义铃声有什么注意事项?
为了保证自定义铃声能够及时生效,在使用厂商通道的自定义铃声时,需要调用如下代码,提前初始化相应的通道和铃声文件
private void initNotifyChannel(String id, String name, String sound) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 通知渠道的id 这个地方只要一直即可
// 用户可以看到的通知渠道的名字.
// 用户可以看到的通知渠道的描述
String description = "notification description";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel mChannel = new NotificationChannel(id, name, importance);
// 配置通知渠道的属性
mChannel.setDescription(description);
// 设置通知出现时的闪灯(如果 android 设备支持的话)
mChannel.enableLights(true);
mChannel.setLightColor(Color.RED);
// 自定义声音
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/raw/" + sound);
Log.d("uri", (uri == null) + " " + uri.isRelative());
mChannel.setSound(uri, null);
// 设置通知出现时的震动(如果 android 设备支持的话)
mChannel.enableVibration(true);
mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
//最后在notificationmanager中创建该通知渠道
mNotificationManager.createNotificationChannel(mChannel);
}
}