本篇文章结构
一、集成流程。
二、集成中遇到的问题
集成过程
先打开 官方文档
很清楚,前几部没什么说的,去官网注册账号就好了,我们接下来看账号集成。
首先第一步是集成模式选择
- 独立模式:私钥由开发者保存,公钥由腾讯保存。开发者使用私钥生成用户签名 UserSig,腾讯使用公钥对签名 UserSig 进行校验。
-
托管模式:私钥由腾讯保存,公钥由开发者保存。腾讯使用私钥生成用户签名 UserSig,开发者可以使用公钥对签名 UserSig 进行校验,注意,对于第三方开放帐号,此时不需要公私钥。
这里可以根据你们的业务需求选择合适的模式。
这里选择独立模式集成,也就是后台使用私钥生成用户签名,APP端使用UserSig调用SDK登录腾讯服务器,登录成功后就可以使用IM功能了。
然后就要开始下载SDK进行集成了。
这里是区分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
图片消息发送是成功的,因为发送方式跟文本消息是一样的,但是在接收时却接收不到。
这是两个版本的文档说明,我找了半天也没找到参数在哪,图片从哪里获取。
然后截图投诉了一下他们的产品,说找不到他们写的参数在哪?
然后大概在6点左右,收到一条短信,说图片会自动保存在path路径下。我试了一下,果然取到了。我。。。这文档写的。。。
至此问题2解决。
问题3
因为有用到群聊的功能,所以创建的是Public类型的群组,然而在邀请好友入群的时候却报错10007,this group is not enable invite.
然后去看错误码,发现没什么用。
然后我再次投诉,他们的产品,
到现在没有回复。
发现还是没什么用。
文档写的是不允许群成员邀请他人入群,然而就是群主也不能邀请他人入群。
这个问题到现在也没能解决,目前能实现的是他人可以通过申请加入群。。。
好了,这篇博客到此结束,希望能帮到有同样困扰的小伙伴。