騰訊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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM