本篇文章結(jié)構(gòu)
一、集成流程躬贡。
二谆奥、集成中遇到的問題
集成過程
先打開 官方文檔
很清楚,前幾部沒什么說的拂玻,去官網(wǎng)注冊賬號就好了酸些,我們接下來看賬號集成宰译。
首先第一步是集成模式選擇
- 獨(dú)立模式:私鑰由開發(fā)者保存,公鑰由騰訊保存魄懂。開發(fā)者使用私鑰生成用戶簽名 UserSig沿侈,騰訊使用公鑰對簽名 UserSig 進(jìn)行校驗(yàn)。
-
托管模式:私鑰由騰訊保存市栗,公鑰由開發(fā)者保存肋坚。騰訊使用私鑰生成用戶簽名 UserSig,開發(fā)者可以使用公鑰對簽名 UserSig 進(jìn)行校驗(yàn)肃廓,注意智厌,對于第三方開放帳號,此時不需要公私鑰盲赊。
這里可以根據(jù)你們的業(yè)務(wù)需求選擇合適的模式铣鹏。
這里選擇獨(dú)立模式集成,也就是后臺使用私鑰生成用戶簽名哀蘑,APP端使用UserSig調(diào)用SDK登錄騰訊服務(wù)器诚卸,登錄成功后就可以使用IM功能了。
然后就要開始下載SDK進(jìn)行集成了绘迁。
這里是區(qū)分SDK版本號的合溺,不同的版本它的文檔是不一樣。
我這里選擇的是V3.x的版本缀台。
騰訊提供了一個demo 隨心聊IM 不過這個demo中使用的SDK版本是V2.x棠赛。
所以如果你要集成的是V3.x的版本,你還需要注意他們的區(qū)別膛腐。
關(guān)于引入Jar包睛约,清單文件配置等不在贅訴,官方文檔寫的很清楚哲身。
這里說一下SDK的初始化辩涝。
private void init(){
InitBusiness.start(getApplicationContext(), TIMManager.ERROR);//初始化IMSDK
initTIMLoginConfig();//登錄騰訊服務(wù)器
}
private void initTIMLoginConfig()
{
String identify = UserController.getInstance().getPhone();//用戶唯一標(biāo)識
String sig = UserController.getInstance().getSig(); //根據(jù)用戶唯一標(biāo)識生成的簽名
if (!TextUtils.isEmpty(identify)&&!TextUtils.isEmpty(sig))
{
LoginBusiness.loginIm(identify, sig, new TIMCallBack() {
@Override
public void onError(int i, String s) {
Log.e(TAG, "onError: "+s);
}
@Override
public void onSuccess() {
Log.e(TAG, "onSuccess: 登錄成功!");
initIM();
}
});
}
}
private void initIM()
{
//初始化程序后臺后消息推送
PushUtil.getInstance();
//初始化消息監(jiān)聽
MessageEvent.getInstance();
ToastUtils.showMessage(getContext(),"TIM login success");
String deviceMan = android.os.Build.MANUFACTURER;
//注冊小米和華為推送 //
/* if (deviceMan.equals("Xiaomi") && shouldMiInit()){
MiPushClient.registerPush(getApplicationContext(), Constants.MI_APP_ID, Constants.MI_APP_KEY);
}else if (deviceMan.equals("HUAWEI")){
PushManager.requestToken(this);
}*/
Log.e(TAG, "onSuccess: "+ TIMManager.getInstance().getLoginUser());
//設(shè)置自己的好友驗(yàn)證方式為需要驗(yàn)證
TIMFriendshipManager.ModifyUserProfileParam param = new TIMFriendshipManager.ModifyUserProfileParam();
param.setAllowType(TIMFriendAllowType.TIM_FRIEND_NEED_CONFIRM);
TIMFriendshipManager.getInstance().modifyProfile(param, new TIMCallBack() {
@Override
public void onError(int code, String desc) {
//錯誤碼code和錯誤描述desc勘天,可用于定位請求失敗原因
//錯誤碼code列表請參見錯誤碼表
Log.e(TAG, "modifyProfile failed: " + code + " desc" + desc);
}
@Override
public void onSuccess() {
Log.e(TAG, "設(shè)置好友驗(yàn)證 succ");
}
});
TIMOfflinePushSettings settings = new TIMOfflinePushSettings();
//開啟離線推送
settings.setEnabled(true);
//設(shè)置收到C2C離線消息時的提示聲音怔揩,這里把聲音文件放到了res/raw文件夾下
settings.setC2cMsgRemindSound(null);
TIMManager.getInstance().setOfflinePushSettings(settings);
}
下面是InitBussiness的代碼
/**
* 初始化
* 包括imsdk等
*/
public class InitBusiness {
private static final String TAG = InitBusiness.class.getSimpleName();
private InitBusiness(){}
public static void start(Context context){
initImsdk(context, 0);
}
public static void start(Context context, int logLevel){
initImsdk(context, logLevel);
initUserConfig();
}
/**
* 初始化imsdk
*/
private static void initImsdk(Context context, int logLevel){
TIMSdkConfig config = new TIMSdkConfig(AppConfig.SDK_APPID);
config.enableLogPrint(true)
.setLogLevel(TIMLogLevel.values()[logLevel]);
//初始化imsdk
boolean init = TIMManager.getInstance().init(context, config);
//禁止服務(wù)器自動代替上報已讀
Log.d(TAG, "initIMsdk"+init);
}
private static void initUserConfig()
{
//基本用戶配置
TIMUserConfig userConfig = new TIMUserConfig()
.setUserStatusListener(new TIMUserStatusListener() {
@Override
public void onForceOffline() {
//被其他終端踢下線
Log.i(TAG, "onForceOffline");
// App.TOKEN = "";
// UserControl.getInstance().clear();
// DataCleanManager.clearAllCache(getContext());
// PageRouter.startLogin(getContext());
// finish();
}
@Override
public void onUserSigExpired() {
//用戶簽名過期了,需要刷新userSig重新登錄SDK
Log.i(TAG, "onUserSigExpired");
}
})
//設(shè)置連接狀態(tài)事件監(jiān)聽器
.setConnectionListener(new TIMConnListener() {
@Override
public void onConnected() {
Log.i(TAG, "onConnected");
}
@Override
public void onDisconnected(int code, String desc) {
Log.i(TAG, "onDisconnected");
}
@Override
public void onWifiNeedAuth(String name) {
Log.i(TAG, "onWifiNeedAuth");
}
});
RefreshEvent.getInstance().init(userConfig);
userConfig = FriendshipEvent.getInstance().init(userConfig);
userConfig = MessageEvent.getInstance().init(userConfig);
userConfig = GroupEvent.getInstance().init(userConfig);
//將用戶配置與通訊管理器進(jìn)行綁定
TIMManager.getInstance().setUserConfig(userConfig);
}
public interface OffLineNotify{
void exit();
}
}
至此登錄成功后脯丝,就可以使用即使通信服務(wù)了商膊。
收發(fā)消息這塊跟SDK版本號沒有很大影響,可以參考demo巾钉,就能實(shí)現(xiàn)基本的聊天功能了翘狱。
遇到的問題
1.首次進(jìn)入聊天頁面獲取不到聊天列表秘案。
2.發(fā)送圖片消息獲取不到圖片砰苍。
3.創(chuàng)建的Public群組潦匈,群主無法邀請好友入群。
問題一
先說第一個問題赚导,因?yàn)楣P者的項目結(jié)構(gòu)是MainActivity+fragment的結(jié)構(gòu)茬缩,項目一打開就是聊天列表頁,但是每次打開項目吼旧,聊天列表總是獲取不到凰锡,后來debug發(fā)現(xiàn)了問題所在,因?yàn)橛脩舻牡卿浭菍懺贛ainActivity中圈暗,fragment的加載也是在MainActivity中完成的掂为。
就是上面代碼中的登錄,我們知道登錄是耗時操作员串,所以問題就是在登錄還沒有成功的時候勇哗,fragment已經(jīng)加載出來,并且去獲取了聊天列表寸齐,而此時用戶還沒有登錄成功欲诺,所以每次進(jìn)入頁面取到的列表都是空的。
最后解決方案就是渺鹦,我在登錄成功的回調(diào)中發(fā)送一條消息扰法,在聊天列表的fragment中接收消息,然后再去獲取聊天列表毅厚。
至此問題1得到解決塞颁。
問題2
圖片消息發(fā)送是成功的,因?yàn)榘l(fā)送方式跟文本消息是一樣的吸耿,但是在接收時卻接收不到殴边。
這是兩個版本的文檔說明锤岸,我找了半天也沒找到參數(shù)在哪,圖片從哪里獲取板乙。
然后截圖投訴了一下他們的產(chǎn)品是偷,說找不到他們寫的參數(shù)在哪?
然后大概在6點(diǎn)左右募逞,收到一條短信蛋铆,說圖片會自動保存在path路徑下。我試了一下放接,果然取到了刺啦。我。纠脾。玛瘸。這文檔寫的蜕青。。糊渊。
至此問題2解決右核。
問題3
因?yàn)橛杏玫饺毫牡墓δ埽詣?chuàng)建的是Public類型的群組渺绒,然而在邀請好友入群的時候卻報錯10007,this group is not enable invite.
然后去看錯誤碼贺喝,發(fā)現(xiàn)沒什么用。
然后我再次投訴宗兼,他們的產(chǎn)品躏鱼,
到現(xiàn)在沒有回復(fù)。
發(fā)現(xiàn)還是沒什么用殷绍。
文檔寫的是不允許群成員邀請他人入群挠他,然而就是群主也不能邀請他人入群。
這個問題到現(xiàn)在也沒能解決篡帕,目前能實(shí)現(xiàn)的是他人可以通過申請加入群殖侵。。镰烧。
好了拢军,這篇博客到此結(jié)束,希望能幫到有同樣困擾的小伙伴怔鳖。