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.
然后去看错误码,发现没什么用。
然后我再次投诉,他们的产品,
到现在没有回复。
发现还是没什么用。


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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容