本篇文章结构

一、集成流程。

二、集成中遇到的问题

集成过程

cc79230e4219325ba309c1493b276124.png

TIM图片20180425151417.png

很清楚,前几部没什么说的,去官网注册账号就好了,我们接下来看账号集成。

首先第一步是集成模式选择

独立模式:私钥由开发者保存,公钥由腾讯保存。开发者使用私钥生成用户签名 UserSig,腾讯使用公钥对签名 UserSig 进行校验。

托管模式:私钥由腾讯保存,公钥由开发者保存。腾讯使用私钥生成用户签名 UserSig,开发者可以使用公钥对签名 UserSig 进行校验,注意,对于第三方开放帐号,此时不需要公私钥。

这里可以根据你们的业务需求选择合适的模式。

这里选择独立模式集成,也就是后台使用私钥生成用户签名,APP端使用UserSig调用SDK登录腾讯服务器,登录成功后就可以使用IM功能了。

然后就要开始下载SDK进行集成了。

f0b27bf55a58da1aaf3dfea36c9d980b.png

TIM图片20180425153120.png

这里是区分SDK版本号的,不同的版本它的文档是不一样。

我这里选择的是V3.x的版本。

腾讯提供了一个demo 随心聊IM 不过这个demo中使用的SDK版本是V2.x。

所以如果你要集成的是V3.x的版本,你还需要注意他们的区别。

关于引入Jar包,清单文件配置等不在赘诉,官方文档写的很清楚。

这里说一下SDK的初始化。

private void init(){

InitBusiness.start(getApplicationContext(), TIMManager.ERROR);//初始化IMSDK

initTIMLoginConfig();//登录腾讯服务器

}

private void initTIMLoginConfig()

{

String identify = UserController.getInstance().getPhone();//用户唯一标识

String sig = UserController.getInstance().getSig(); //根据用户唯一标识生成的签名

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();

//初始化消息监听

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());

//设置自己的好友验证方式为需要验证

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, "设置好友验证 succ");

}

});

TIMOfflinePushSettings settings = new TIMOfflinePushSettings();

//开启离线推送

settings.setEnabled(true);

//设置收到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);

//禁止服务器自动代替上报已读

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");

}

})

//设置连接状态事件监听器

.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);

//将用户配置与通讯管理器进行绑定

TIMManager.getInstance().setUserConfig(userConfig);

}

public interface OffLineNotify{

void exit();

}

}

至此登录成功后,就可以使用即使通信服务了。

收发消息这块跟SDK版本号没有很大影响,可以参考demo,就能实现基本的聊天功能了。

遇到的问题

1.首次进入聊天页面获取不到聊天列表。

2.发送图片消息获取不到图片。

3.创建的Public群组,群主无法邀请好友入群。

问题一

先说第一个问题,因为笔者的项目结构是MainActivity+fragment的结构,项目一打开就是聊天列表页,但是每次打开项目,聊天列表总是获取不到,后来debug发现了问题所在,因为用户的登录是写在MainActivity中,fragment的加载也是在MainActivity中完成的。

就是上面代码中的登录,我们知道登录是耗时操作,所以问题就是在登录还没有成功的时候,fragment已经加载出来,并且去获取了聊天列表,而此时用户还没有登录成功,所以每次进入页面取到的列表都是空的。

最后解决方案就是,我在登录成功的回调中发送一条消息,在聊天列表的fragment中接收消息,然后再去获取聊天列表。

至此问题1得到解决。

问题2

图片消息发送是成功的,因为发送方式跟文本消息是一样的,但是在接收时却接收不到。

aa91b6fb098b606fdb6cbd93604fbfff.png

V2.x的文档介绍。

0c69814e432f45b3343a9964f2580985.png

V3.x的文档介绍。

这是两个版本的文档说明,我找了半天也没找到参数在哪,图片从哪里获取。

然后截图投诉了一下他们的产品,说找不到他们写的参数在哪?

然后大概在6点左右,收到一条短信,说图片会自动保存在path路径下。我试了一下,果然取到了。我。。。这文档写的。。。

至此问题2解决。

问题3

因为有用到群聊的功能,所以创建的是Public类型的群组,然而在邀请好友入群的时候却报错10007,this group is not enable invite.

然后去看错误码,发现没什么用。

然后我再次投诉,他们的产品,

到现在没有回复。

发现还是没什么用。

534ed5cf69b0abd1365cd355a3287d95.png

文档写的是不允许群成员邀请他人入群,然而就是群主也不能邀请他人入群。

这个问题到现在也没能解决,目前能实现的是他人可以通过申请加入群。。。

好了,这篇博客到此结束,希望能帮到有同样困扰的小伙伴。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐