项目中接入腾讯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

腾讯IM的那些坑的更多相关文章

  1. 两百条微信小程序跳坑指南(不定时更新)

    微信小程序联盟出品 跳坑textarea<二百二十三>不显示文本及textarea相关问题集合跳坑<二百一十三> background-image无法获取本地资源图片....跳 ...

  2. 安卓高级9 shareSDK 第三方登陆和分享Mob

    ShareSDK推荐此官网地址 官网注册和申请key流程 注册 略 进入后台创建应用得到可以 下载SDK 解压下载的压缩包 第三方平台申请key 如果你想申请QQ登陆或者分享需要去腾讯开发者申请,申请 ...

  3. 【亲测可用网上的不靠谱居多】一个完整的用canvas画内容然后保存到本地的例子

    涉及好多个问题 比如保存到本地有黑色背景 怎么用把文字和图 画到画布上 腾讯的东西就是坑多了 直接上代码吧 啥也不说额 pic.wxml <view class='container'> ...

  4. android蓝牙耳机下的语音(输入/识别)及按键监听

    背景:本人负责公司android平台的app开发,最近要开发一个语音助手类的app,类似于灵犀语音助手.虫洞语音助手等.其中有两个蓝牙耳机下的语音识别问题,比较折腾人,问题描述:1.蓝牙耳机连接下捕获 ...

  5. 大厂程序员教你如何学习C++(内附学习资料)

    目前准备面试同学都知道,C++是百度和腾讯的主流开发语言,而java是阿里的主流开发语言. 对于初学者来说,也不用纠结究竟学习c++还是java 其实只要好好掌握好一门即可,另一门即可融会贯通 因为我 ...

  6. iOS审核这些坑,腾讯游戏也踩过

    作者:Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务. WeTest 导读 在App上架苹果应用商店的过程中,相信大多数iOS开 ...

  7. 安卓易学,爬坑不易——腾讯老司机的RecyclerView局部刷新爬坑之路

    针对手游的性能优化,腾讯WeTest平台的Cube工具提供了基本所有相关指标的检测,为手游进行最高效和准确的测试服务,不断改善玩家的体验.目前功能还在免费开放中. 点击地址:http://wetest ...

  8. 腾讯优测-优社区干货精选 |  那些年,我们在Android机型适配上遇到的坑之Camera拍照时快门咔嚓声

    文/腾讯优测研发工程师 吴宇焕 优测小优有话说: android机型适配的坑自然是不少,不想掉坑快来优测优社区~ 现在Android手机一般都会带有照相功能,有很多朋友就发现手机照相时快门声音很响,想 ...

  9. 腾讯优测-优社区干货精选 | android开发在路上:少去踩坑,多走捷径(下)

    文/腾讯公司 陈江峰 优测小优有话说: android开发的坑自然是不少,不想掉坑快来优测优社区~ 6.Android APP开发中其它需要提醒的问题 android4.4在UI线程无法进行网络操作. ...

随机推荐

  1. k8s调度的预选策略及优选函数

    scheduler调度过程:    Predicate(预选)-->Priority(优选)-->Select(选定)调度方式:    1.节点亲和性调度(NodeAffinity)使用n ...

  2. C语言中sizeof的用法

    今天同学问我sizeof可不可以计算结构体的大小,我竟然忘了C语言还有sizeof这个函数,我是多久没有写程序了啊!!!惭愧,上研究生后写嵌入式方面的程序就特别少了,看来以后还要经常来练练手才行.现在 ...

  3. 【Spring】事务的实现方式

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:转账. 场景设定: 用户名 余额 A 1000 B 1000 操作: A通过支付宝给B转账200块,做这件事情会进行两个操作. 1:A账号- ...

  4. 文件处理seek以及修改内容的两种方式

    f.seek(offset,whence)offset代表文件的指针的偏移量,单位是字节byteswhence代表参考物,有三个取值# 0:参照文件的开头# 1:参照当前文件指针所在位置# 2: 参照 ...

  5. 【js】【转发】jreturn;、return true、return false;区别

    一.返回控制与函数结果, 语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果  二.返回控制, 无函数结果,语法为:return;  在大多数情况下,为事件 ...

  6. gulp的安装和使用

    安装nodejs -> 全局安装gulp -> 项目安装gulp以及gulp插件 -> 配置gulpfile.js -> 运行任务 1.去nodejs官网安装nodejs 2. ...

  7. linux中vim永久显示行号、开启语法高亮

    vim ~/.vimrc 进入insert模式,在最后加二行 syntax on set nu! 保存收工. 设置用视图模式的缩进为4个空格 set smartindent set tabstop=4 ...

  8. (转)rvm安装与常用命令

    rvm是一个命令行工具,可以提供一个便捷的多版本ruby环境的管理和切换. https://rvm.io/ 如果你打算学习ruby/rails, rvm是必不可少的工具之一. 这里所有的命令都是再用户 ...

  9. 数据结构和算法(What Why How)

    数据结构和算法是什么? 从广义上讲,数据结构就是指一组数据的存储结构.算法就是操作数据的一组方法. 从狭义上讲,是指某些著名的数据结构和算法,比如队列.堆.栈.二分查找.动态规划等. 数据结构和算法有 ...

  10. PAT Basic 1081

    1081 检查密码 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母也有数字. 输 ...