歷史重現:
去年11月份,由於某環信通知需要收費了,而且收費還不低,在考察網絡上各種IM聊天之後,我們決定花2w1大洋購買了丁三石公司的**網易雲信**IM聊天工具,網址如下:http://netease.im/。大家也可以上去看一下,個人推薦還是可以的,蠻好用的。如果大家想更換IM工具,網易的還是可以考慮入手的:) 雖然價格還是蠻貴的。
主要問題
由於開發週期比較急(當然你也可以說我是懶,我沒意見),我們直接使用了它的開源組件uikit,經過三個多月的嘗試和使用,感覺還是不錯的。當然了,也出現了一下問題,大夥可以參考一下。
錯誤主要來自bugly記錄,本着要對公司項目負責的緣由和大夥以後少採坑,所以我記錄一下有哪些坑,後期我會fork網易的uikit,你直接fork我的源碼也可以。
1.android.system.ErrnoException
bugly主要描述爲:
這個錯誤來自com.netease.nimlib.dc.a.a.b.a包下的錯誤,通過溝通網易開發人員,得知UIKIT下使用的是雲信sdk4.7,這個bug在sdk4.8之後已經被解決了,所以最好的方法是講雲信SDK更新到5.0(當前時間最新版本,當然官方可能已經更新了)
2.android.os.TransactionTooLargeException
這個bug主要是出現在使用該IM選擇手機中的圖片問題,如下圖:
主要問題在在於
在初始化時,IM獲取了所有的圖片信息,封裝在了AlbumInfo類中,然後選擇某一個具體的相冊路徑時,使用了Intent傳遞了這些AlbumInfo參數,如果手機照片數目足夠多,而Intent傳遞參數時容量是有上限的,因此會造成上述android.os.TransactionTooLargeException
這個問題比較棘手,因爲修改源碼發現涉及到了太多太多的類,所有就採取了自己的方案。
選擇圖片1 | 選擇圖片2 |
---|---|
直接換成了知乎風格的圖片選擇器:
分離圖片 | 選擇圖片 | 發送圖片 |
---|---|---|
因爲我們是整合了網易IM系統,在這個系統之外,我們也有自己的圖片選擇模塊,後來沒有辦法,我們直接將我們的圖片選擇模塊直接替換到自己系統的圖片選擇模塊上。這個真心比較坑,而且還是線上報出來的問題,比較讓人坑爹。說實在的,如果想解決這個問題,這個IM的圖片選擇框架需要重現去寫,不然這個問題一直存在。
3.java.lang.NoClassfoundError:com.netease.nrtc.engine.rawapi.IRTcEnglie
具體問題看下圖:
原因過程:
由於剛開始使用雲信是2017年11月份,那時候還是使用了sdk4.7版本,但是使用的過程中發生了上面的bug1,在詢問相關開發人員之後,他們建議我們更換到現在的sdk5.0版本(當前時間是2018年4月25日)。
在更換的過程中,由於我們系統中沒有使用nim-avchat-5.0.0.jar這個jar包,但還是引入了[我是照抄uikit的],目錄如下:
然後編輯,裝app發現啓動不了,此時如果你係統中沒有用到關於音視頻的API,那麼此時就會報錯,因爲對應的.so文件不存在,所以你需要刪除該nim-avchat-5.0.0.jar,然後重新編譯,即可運行。
4.android.app.RemoteServiceException: Bad notification posted from package my.package Couldn’t create icon: StatusBarIcon(pkg=com.bdl.sgbuser=0 id=0x7f030000 level=0 visible=true num=0)
這個bug我找了差不多半天,不斷的google和baidu,不斷的修改和編譯,還是沒有,最終發現問題所在:
在NimSDKOptionConfig類中:
有一個loadStatusBarNotificationConfig()方法,它配置了消息到達時,Notification的樣式和相關設置:
StatusBarNotificationConfig config = new StatusBarNotificationConfig();
// 點擊通知需要跳轉到的界面
config.notificationEntrance = WelcomeActivity.class;
config.notificationSmallIconId = R.drawable.ic_stat_notify_msg;
config.notificationColor = DemoCache.getContext().getResources().getColor(R.color.color_blue_3a9efb);
// 通知鈴聲的uri字符串
config.notificationSound = "android.resource://com.netease.nim.demo/raw/msg";
config.notificationFolded = true;
// 呼吸燈配置
config.ledARGB = Color.GREEN;
config.ledOnMs = 1000;
config.ledOffMs = 1500;
// 是否APP ICON顯示未讀數紅點(Android O有效)
config.showBadge = true;
// save cache,留做切換賬號備用
DemoCache.setNotificationConfig(config);
這裏並沒有什麼毛病,各項配置都很正常。然後從UserPreferences.getStatusConfig()
獲取用戶的配置,問題就是出現在這裏:如果userConfig不爲空,那麼就取userConfig的配置,notificationSmallIconId的屬性值也是,但是我這次增加了一些Res資源,重新編譯之後,新的notificationSmallIconId將不再是在userConfig中存儲的值,此時就會發生id找不到的Exception,那麼改起來比較粗暴:
直接在options賦值之前,直接更新掉userConfig.notificationSmallIconId
,userConfig.notificationEntrance
,userConfig.showBadge
即可。 這個bug顯示的比較尷尬,也是不小心試出來的,不過感覺在sp中存儲這種比較重要的變量,uikit的設計者我感覺到有些不妥。
5. 各種NullPointerException
這個問題,我一直持保留意見,因爲NPE還是存在一些的,這也可能是沒有好好測試相關造成的,各位就自求多福吧。這個出現了一兩個,平時出現了就修復了,沒關心太多了。
後記,這個會一直更新的,出現了問題,我會第一時間上報雲信和這篇博客的,願網易雲信和你我都越來越好[25219]。
github代碼爲:https://github.com/Microhx/NIM_Android_UIKit
可直接導入項目配置使用。