zoukankan      html  css  js  c++  java
  • 腾讯IM的那些坑

    项目中接入腾讯IM,在这里记录下,以便大家解决问题时少走弯路

     

    1.首先讲一下IM返回对象的问题:

    /**
         * 消息工厂方法
         */
        public static Message getMessage(TIMMessage message){
            switch (message.getElement(0).getType()){
                case Text:
                case Face:
                    return new TextMessage(message);
                case Image:
                    return new ImageMessage(message);
                case Sound:
                    return new VoiceMessage(message);
                case Video:
                    return new VideoMessage(message);
                case GroupTips:
                    return new GroupTipMessage(message);
                case File:
                    return new FileMessage(message);
                case Custom:
                    return new CustomMessage(message);
                default:
                    return null;
            }
        }

    这就是消息的类型用工厂模式,分别转成每个类型

    了解这些消息类型时我们需要对消息进行解析,这里就不赘述了(demo可以参考下)

    设置用户名
    TIMFriendshipManager.getInstance().setNickName(Thinksns.getMy().getUserName(), new TIMCallBack() {
    
    设置用户头像
    TIMFriendshipManager.getInstance().setFaceUrl(faceUrl, new TIMCallBack()

    当设置用户名和头像还有等等信息时,返回来的TimMessage里面是拿不到的。必须请求腾讯接口,拿到信息在对每项进行匹配,显然这是不友好的。

    下面上获取用户和群的信息代码(注:获取任何人,不是好友也可以)

     public void getAllsForidentifier(final int id, final String uname) {
            //待获取用户资料的用户列表
            List<String> users = new ArrayList<String>();
            users.add(id + "");
            //获取用户资料
            TIMFriendshipManager.getInstance().getUsersProfile(users, new TIMValueCallBack<List<TIMUserProfile>>() {
                @Override
                public void onError(int code, String desc) {
                    //错误码code和错误描述desc,可用于定位请求失败原因
                    //错误码code列表请参见错误码表
                    Log.e("111", "getUsersProfile failed: " + code + " desc");
                    ToastUtils.showToastOnce(ActivityUserInfo_2.this, "对方还未开通IM聊天功能");
                    if (smallDialog != null) {
                        smallDialog.dismiss();
                    }
                }
    
                @Override
                public void onSuccess(List<TIMUserProfile> result) {
                    if (smallDialog != null) {
                        smallDialog.dismiss();
                    }
                    UnitSociax.chatToIMC2C(ActivityUserInfo_2.this, id, uname);
                }
            });
        }
    
    
      public void getMyGroupForidentifier(String id) {
            //创建待获取信息的群组Id列表
            ArrayList<String> groupListtt = new ArrayList<String>();
            //添加群组
            String groupId = id;
            groupListtt.add(groupId);
            //创建回调
            TIMValueCallBack<List<TIMGroupDetailInfo>> cb = new TIMValueCallBack<List<TIMGroupDetailInfo>>() {
                @Override
                public void onError(int code, String desc) {
                    //错误码code和错误描述desc,可用于定位请求失败原因
                    //错误码code列表请参见错误码表
                }
    
                @Override
                public void onSuccess(List<TIMGroupDetailInfo> infoList) { //参数中返回群组信息列表
                    other_name = infoList.get(0).getGroupName();
                    templateTitle.setTitleText(other_name);
                }
            };

    2.关于离线推送的坑(个人见解,个人实践后的)

    接入离线推送怎么也接不通,后来申请小米离线的key 和 密码 接入小米成功,然后本项目奇迹般的离线推送自己好了。

    小米华为的代码

     String vendor = Build.MANUFACTURER;
                    if (vendor.toLowerCase(Locale.ENGLISH).contains("xiaomi")) {
                        //注册小米推送服务
                        MiPushClient.registerPush(ActivityHome.this, "xxxxxxxxxx", "xxxxxxx");
                    } else if (vendor.toLowerCase(Locale.ENGLISH).contains("huawei")) {
                        //请求华为推送设备token
                        PushManager.requestToken(ActivityHome.this);
                    }

    和检查离线推送是否开启的代码(默认是开启的)

     //检查是否开启离线推送
            TIMManager.getInstance().getOfflinePushSettings(new TIMValueCallBack<TIMOfflinePushSettings>() {
                @Override
                public void onError(int i, String s) {
                    Log.e("sss", "get offline push setting error " + s);
                }
    
                @Override
                public void onSuccess(TIMOfflinePushSettings timOfflinePushSettings) {
                    Log.e("sss", "get offline push setting success "+ timOfflinePushSettings.isEnabled()+"" );
    //                timOfflinePushSettings.isEnabled();
                }
            });

    3.自定义消息可以这么做(还有其他方法)

     public void sendGoos(String goods_id, String img, String title, String price) {
            //构造一条消息来发送自定义消息-商品
            TIMMessage msg = new TIMMessage();
            // xml协议的自定义消息
            String sampleXml = "{"userAction":1,"img":"" + img + "","title":"" + title + "","goods_id":"" + goods_id + "","price":"" + price + ""}";
            //向TIMMessage中添加自定义内容
            TIMCustomElem elem = new TIMCustomElem();
            elem.setData(sampleXml.getBytes());      //自定义byte[]
            elem.setDesc("this is one custom message"); //自定义描述信息
            //将elem添加到消息
            if (msg.addElement(elem) != 0) {
                Log.d("", "addElement failed");
                return;
            }
            presenter.sendMessage(msg);
        }

    他是用自定义byte[]发送的 值得注意的是 sampleXml  这个string字符串就是发送的消息json类型的到时候拿到直接进行解析

    4.消息过滤

    这里多注意消息类型,正在输入时类型为TYPING,ios消息类型不对也会引起消息出现问题

    总结:

    遇到问题多看看错误码,官方文档,(客服其实解决不了啥问题,就知道发链接),一般遇到问题都是消息类型或者创建消息有问题

    ,demo中重要的逻辑暂时没遇到过有问题,有一些小框架问题不少。

    如果遇到推送和聊天列表的问题,可参考ConversationAdapter中怎么排除。

    by:磊磊tua

  • 相关阅读:
    diary and html 文本颜色编辑,行距和其它编辑总汇
    bash coding to changeNames
    virtualbox ubuntu 网络连接 以及 连接 secureCRT
    linux 学习6 软件包安装
    linux 学习8 权限管理
    vim 使用2 转载 为了打开方便
    ubuntu
    linux 学习15 16 启动管理,备份和恢复
    linux 学习 14 日志管理
    linux 学习 13 系统管理
  • 原文地址:https://www.cnblogs.com/widgetbox/p/8674678.html
Copyright © 2011-2022 走看看