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