Android集成腾讯云通信IM

本篇文章结构

一、集成流程。
二、集成中遇到的问题
集成过程

先打开 官方文档

TIM图片20180425151417.png

很清楚,前几部没什么说的,去官网注册账号就好了,我们接下来看账号集成。
首先第一步是集成模式选择

  • 独立模式:私钥由开发者保存,公钥由腾讯保存。开发者使用私钥生成用户签名 UserSig,腾讯使用公钥对签名 UserSig 进行校验。
  • 托管模式:私钥由腾讯保存,公钥由开发者保存。腾讯使用私钥生成用户签名 UserSig,开发者可以使用公钥对签名 UserSig 进行校验,注意,对于第三方开放帐号,此时不需要公私钥。
    这里可以根据你们的业务需求选择合适的模式。
    这里选择独立模式集成,也就是后台使用私钥生成用户签名,APP端使用UserSig调用SDK登录腾讯服务器,登录成功后就可以使用IM功能了。

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


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

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

V2.x的文档介绍。
V3.x的文档介绍。

这是两个版本的文档说明,我找了半天也没找到参数在哪,图片从哪里获取。
然后截图投诉了一下他们的产品,说找不到他们写的参数在哪?
然后大概在6点左右,收到一条短信,说图片会自动保存在path路径下。我试了一下,果然取到了。我。。。这文档写的。。。
至此问题2解决。

问题3

因为有用到群聊的功能,所以创建的是Public类型的群组,然而在邀请好友入群的时候却报错10007,this group is not enable invite.
然后去看错误码,发现没什么用。
然后我再次投诉,他们的产品,
到现在没有回复。
发现还是没什么用。


文档写的是不允许群成员邀请他人入群,然而就是群主也不能邀请他人入群。
这个问题到现在也没能解决,目前能实现的是他人可以通过申请加入群。。。

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

推荐阅读更多精彩内容