Android 9.0 腾讯云IM无法登陆报错6012

起因

之前接入腾讯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<ActivityManager.RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();
        if (processInfos == null) {
            QLog.i("TAG", "isMainProcess get getRunningAppProcesses null");
            List<ActivityManager.RunningServiceInfo> 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接入文档

云通信SDK常见问题

公众号

《Android 9.0 腾讯云IM无法登陆报错6012》

    原文作者:代码君_Coder
    原文地址: https://www.jianshu.com/p/9f2eee9795d5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞