• 腾讯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

  • 相关阅读:
    封装图片处理类(缩略图)
    封装表单验证类
    魔术方法
    封装自己的smartyBC类
    快捷键
    unicode
    基本数据类型课上练习
    数制总结
    12.29.作业
    12.28作业
  • 原文地址:https://www.cnblogs.com/widgetbox/p/8674678.html
Copyright © 2020-2023  润新知