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; } }
參考文獻
公眾號
