起因
之前接入腾讯IM,功能都正常使用,后来华为市场要求适配9.0,所以我们就把目标版本升为28
targetSdkVersion : 28
结果发现部分功能出现不可以使用的情况,其中IM互踢功能比较严重,一直报6012错误
im login failed. code: 6012 err_msg: Session for Android send packet timeout
但是把目标版本降为26后又可以继续使用,说明在Android 9.0 后需要进行适配
解决
我就去官网,下载最新的SDK,根据sdk demo,是可以在9.0上实现互踢功能的,后来我照着最新demo,搬到我们的项目里,但是还是报6012 错误,我就奇怪了,为啥会这样,后来我一个个比对,发现,缺少一个判断语句,没错,就是这句话SessionWrapper.isMainProcess(getApplicationContext()),用于判断是否在主线程里,我之前以为在Application里面肯定是在主线程里啊,所以没加这个判断,结果就出现一直无法登陆的错误,仔细一分析也有道理,如果没在主线程里,就是初始化没有成功,那么IM登陆报错就很正常了,所以如果大家也遇到IM登陆报6012的错误,可以试着加入是否在主线程的判断
//判断是否是在主线程---必须加,否则IM无法互踢
if (SessionWrapper.isMainProcess(getApplicationContext())) {
//初始化IM
TUIKitUtils.init(this, AppConstants.SDK_APPID, BaseUIKitConfigs.getDefaultConfigs());
}
SessionWrapper.isMainProcess(getApplicationContext()),这个方法是封装在腾讯IM最新SDK里面
需要引入下面的包才可以使用
compile 'com.tencent.imsdk:imsdk:4+'
如果你不想引入,我也把方法给你们提取出来了,下面就是判断是否在主线程的源码,直接利用下面的方法也可以!
public static boolean isMainProcess(Context context) {
ActivityManager am = (ActivityManager)context.getSystemService("activity");
String mainProcessName = context.getPackageName();
int myPid = Process.myPid();
List processInfos = am.getRunningAppProcesses();
if (processInfos == null) {
QLog.i("TAG", "isMainProcess get getRunningAppProcesses null");
List processList = am.getRunningServices(2147483647);
if (processList == null) {
QLog.i("TAG", "isMainProcess get getRunningServices null");
return false;
} else {
Iterator var9 = processList.iterator();
ActivityManager.RunningServiceInfo rsi;
do {
if (!var9.hasNext()) {
return false;
}
rsi = (ActivityManager.RunningServiceInfo)var9.next();
} while(rsi.pid != myPid || !mainProcessName.equals(rsi.service.getPackageName()));
return true;
}
} else {
Iterator var5 = processInfos.iterator();
ActivityManager.RunningAppProcessInfo info;
do {
if (!var5.hasNext()) {
return false;
}
info = (ActivityManager.RunningAppProcessInfo)var5.next();
} while(info.pid != myPid || !mainProcessName.equals(info.processName));
return true;
}
}
参考文献
腾讯IM接入文档:https://cloud.tencent.com/document/product/269/32678
云通信SDK常见问题:https://cloud.tencent.com/document/product/269/32483#.E7.99.BB.E5.BD.95.E6.8A.A5.E9.94.99-6012-.E6.88.96-tlssdk-exchange-ticket-fail-.EF.BC.9F