环信IM集成指南Android 端常见问题整理
Posted 环信即时通讯云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了环信IM集成指南Android 端常见问题整理相关的知识,希望对你有一定的参考价值。
1、如何修改系统通知中的头像和用户名
系统通知是在主module中自己写的,demo中是AgreeMsgDelegate,InviteMsgDelegate,OtherMsgDelegate中去修改头像和用户名。
2. 如何修改会话列表中系统消息的头像和消息里的环信ID?
在创建系统消息的时候,去修改设设置的username。
系统消息的创建一般在好友监听和群监听中。
3. app端使用token登录,怎么获取单个用户的token?
获取单个用户的token需要调rest接口去获取。
文档中的Request Body要修改一下使用:
"grant_type": "password",
"username": "omg2",
"password": "123456"
参考文档:http://docs-im.easemob.com/im/server/ready/user#获取管理员权限
4. 设置群组全员禁言后,怎么获取该群组是否是全员禁言状态?
调用获取群组详情的api拿到EMGroup对象,然后再调用isAllMemberMuted去获取是否全员禁言。
EMGroup group = EMClient.getInstance().groupManager().getGroupFromServer(groupId);
group.isAllMemberMuted();
5. 登录成功后获取不到群组信息,后台查看用户是在群内,怎么解决?
检查下是否是从本地获取的群组信息,当用户打开app时,需要先从服务器拉取群组信息(放子线程中)。
6. 何时调用本地群组信息,何时调用从服务器获取群组信息?
打开App,从服务器拉取(从服务器拉取之后,sdk会保存在本地,再调用本地获取能拿到信息),当群成员更新的时候,从服务器获取。
7. 如何设置群组永久禁言?
将禁言时间设置为-1即可。
EMClient.getInstance().groupManager().muteGroupMembers(groupId, muteMembers, -1);
8. 获取群成员数总是来回变化?
检查看下是否使用的是获取完整的群成员列表。
参考文档:https://docs-im.easemob.com/im/android/basics/group#获取完整的群成员列表
9. 消息能发送成功,但是接收不到别人发给我的消息。
检查下注册的环信id是否含有大写字母,如果含有大写字母的话,需要在登录的时候去转换成小写,发送消息等操作都是需要使用小写字母的。
10. 创建聊天室,显示you hava no permission to do this
创建聊天室,只能使用rest接口去创建。
参考文档:https://docs-im.easemob.com/im/server/basics/chatroom#创建聊天室
11. 设置的自动同意添加好友,为什么添加之后好友列表里查找不到?
回答:用户A添加 用户 B为好友,如果用户B是离线状态的话,用户A的好友列表是里不显示用户B的,用户 B上线之后,用户A的好友列表中会出现用户B。
12. 怎么去设置头像和昵称?
EaseIMkit设置头像和昵称:
1.头像和昵称是Easeimkit处理的,我们只需要在application中调用easeimkit的setUserProvider根据环信id,将本地存储的头像和昵称封装到EaseUser中返回给Easeimkit即可(具体可参考demo)
2.getUserInfo中的处理逻辑是:根据username先去本地获取,如果本地获取不到,再从服务器获取,并保存到本地或者做一个三级缓存,然后,再刷新会话列表。(注:getuserinfo是同步的)
13. 如何设置是听筒模式还是扬声器?
回答:easeimkit中isSpeakerOpened()回调中去设置。
14. 怎么发送红包消息?
1.发送自定义消息并携带扩展字段(扩展字段用来判断是显示已领取还是未领取),设置红包的自定义布局(已领取和未领取),默认未领取。
2.当用户点击领取红包之后(修改扩展字段的为已领取状态),将未领取隐藏显示已领取。并发送cmd消息,在接收到cmd消息后 ,修改扩展字段的为已领取状态,并刷新ui。
3.当用户杀掉app进来之后,根据扩展字段来决定显示已领取还是未领取。
15. 发送文件大小超过20M怎么办?
发送视频文件(在EMOption中设置不上传不下载),先去上传到你们的服务器上保存,拿到url放在消息里发送给对方(setRemoteUrl),对方收到之后解析消息里的url去下载视频文件。(注:这种方法会导致所有的附件都不下载不上传)
16. demo中使用的是百度地图,我想使用高德地图,怎么使用?
需要重写聊天页面地图的点击事件,跳转到高德就可以。
17. 在聊天页面点击视频,没有反应?
需要去自定义一个fragment去继承EaseChatFragment,重写EaseChatFragment中的selectVideoFromLocal。(具体实现可以参考demo中的ChatFragment)
18. 拉取漫游数据后,展示的时间是乱的,没有按时间排序?
1. 先打印下漫游数据和本地缓存中的数据是否一致?
2.检查下在EMOption中是否设置
option.setSortMessageByServerTime(false)
19.EMMessage怎么区分离线消息还是在线消息?
EMMessage中没有方法可以去判断是离线消息还是在线消息。
实现方法:
可以在接收消息的监听中,获取到消息的时间戳与本地时间戳做对比,超过一定的时间就算离线消息。 但是前提需要保证本地的时间戳是对的。
20.集成了环信SDK后的安卓App,只要授予了定位权限,一启动就会访问用户的位置信息,如果启动App不访问用户位置信息?
在EMOptions中设置setEnableStatistics为false。
21. gradle的形式引入easeimkit,怎么去监听发送消息成功或者失败?
在easeimkit中没有将发送成功的事件,回调到fragment中,如果用户需要在自定义view中用的话,继承EaseChatRow并重写onMessageSuccess()。
22. 如何实现一键已读功能?
可以调用将所有消息置为已读的api:
EMClient.getInstance().chatManager().markAllConversationsAsRead();
参考文档链接:http://docs-im.easemob.com/im/android/basics/message#未读消息数清零
23. 怎么收不到oppo推送?
1.检查下是否已经安装官网的文档去集成了oppo推送,在控制台搜索
EMPushHelper,是否有[EMPushHelper] uploadTokenInternal success输出,如果没有输出 ,请检查下oppo的集成。
2.在完成第一步的情况下,还是收不到离线推送,请检查下密钥上传的是否正确,console后台上传密钥是:master secret ,在 app中上传的密钥的是app secret。如果不正确请删除重新上传并提交工单提供appkey+证书id,让环信技术支持在后台解禁。
24.如何设置在线消息免打扰?
单个会话的免打扰模式您可以自己去实现,要自己去维护一个免打扰list集合,当监听到有消息时,去判断下是否是免打扰用户,如果是免打扰用户,就不去提醒。
群组免打扰:可以使用rest去设置。("notification_ignore_群组id": true)
25.搜索会话列表如何根据昵称搜索(或者根据其他某个字段去搜索)。
可以把会话显示的昵称(或某个字段)放在会话的扩展里,搜索的时候遍历会话扩展里的昵称。
26.群公告的长度有限制吗?
群公告不能超过512 字符。
27.如何设置群扩展字段
1.通过EMGroupOptions的extField设置的扩展字段。
2.从服务器获取群组信息,获取getExtension
EMGroup group = EMClient.getInstance().groupManager().getGroupFromServer(groupId);group.getExtension();
28.oppo推送报空指针
Process: com.example.is, PID: 24696
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.PackageManager android.content.Context.getPackageManager()' on a null object reference
at com.heytap.mcssdk.d.a(Unknown Source:7)
at com.heytap.mcssdk.d.l(Unknown Source:6)
at com.heytap.mcssdk.d.n(Unknown Source:0)
at com.heytap.msp.push.HeytapPushManager.isSupportPush(Unknown Source:4)
at com.hyphenate.push.platform.oppo.a.b(Unknown Source:0)
at com.hyphenate.push.platform.a.a(Unknown Source:6)
at com.hyphenate.push.EMPushHelper.a(Unknown Source:145)
at com.hyphenate.push.EMPushHelper.register(Unknown Source:35)
at com.hyphenate.chat.EMClient$7.run(Unknown Source:204)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
需要在application中对oppo进行初始化(如下图)。
29、android端本地在构造图片消息时 可以设置缩略图大小
( EMImageMessageBody.setThumbnailSize()) 也可以在console后台进行设置.
30、接收方接收到图片消息后 为什么remoteUrl和thumbnailUrl是一样的
(这个与header里面的参数有关)
curl -H 'thumbnail: true' -o 缩略图.png https://a1.easemob.com/easemob-demo/easeim/chatfiles/a9ad3cd0-3265-11ec-8a89-3fd8d64dc854
curl -o 原图.png https://a1.easemob.com/easemob-demo/easeim/chatfiles/a9ad3cd0-3265-11ec-8a89-3fd8d64dc854
31、新push一次性可以给多少用户推送消息?
回答:一次可以推100个
32、漫游功能可以配置过滤cmd、已读回执等消息
需要联系环信工作人员进行配置
33、如果是内网环境、物联网定向流量卡等 需要配置域名白名单或者ip白名单 允许访问环信接口
(以上需要先对接商务验证身份后会提供对应的域名或者ip地址)
34、Android端如果有使用okhttp三方网络框架,没有做特殊处理可能会遇见SSL无法获取到信任证书问题
可以参考这篇文章解决:Unable to extract the trust manager on Android10Platform 完美解决 - IM Geek开发者社区-移动开发者社区-开源社区-IM Geek官网
35、批量获取用户属性一次性最多获取100个id属性 超过的可以分段获取
36、开通敏感词后发现默认词库过滤了自己想要的词汇
导致消息发送失败或者以*号展示
这种情况下可以联系环信这边配置敏感词白名单进行过滤(需要提供appkey 和 需要添加白名单的词汇)
37、某些情况下客户端只能允许https协议
这个有2种解决方式
1、如果是已经上线的 可以直接找环信这边修改dnsconfig配置 全部换成https协议
2、如果是开发中的 可以在sdk初始化的时候在EMoptions里面设置onlyhttps
38、关于Android第三方推送对接
比如极光厂商对接、阿里云推送厂商对接、友盟厂商对接 这些目前来看都是可以实现的 只不过需要客户侧做一些特殊处理,对应推送厂商的sdk可以不用在重复
进行依赖,环信这边只需要在console后台上传证书信息并在端上初始化sdk的时候配置push信息、获取到第三方推送厂商返回的devicetoken并上传给环信进行绑定即可。
39、发送后回调可以配置指定字段containsExtProperties正向匹配回调
(举例说明 回调配置了containsExtProperties:“okgo” 当发送的消息扩展中带有这个okgo字段时,这条消息就会进行回调,不包含这个字段
的则不进行回调)
40、android通讯录首字母识别不准确的问题
升级ui库到V3.8.5解决
41、rest 发送消息可以设置ip白名单
也就是说可以配置自己服务器的ip,除了该服务器可以访问环信其它ip的请求全部过滤,防止重要信息泄露后有人故意往调用发送消息接口(这个在console后台安全配置可以设置)
42、目前android这边发现有些情况下会出现自己只登录了一个设备却老是被其它设备踢下线
查看登录记录后发现是来自同一个设备踢下线的事件,这种情况下就得分析一下是什么原因导致的自踢:
1、集成问题多进程多次初始化sdk会出现类似现象
2、网络问题a账号登录服务端记录了状态之后,a账号突然没网服务端没法在心跳触发之前即时更新离线状态,这时候网络又恢复进行了重连又进行了登录,这时候服务端本身记录是登录状态,再次登录会把之前的踢下线,这种现象会造成自踢(解决方案 可以联系环信人员配置不自踢)
43、推送扩展字段结构 其中e为完全用户自定义扩展
而数据来源为em_apns_ext字段和em_apns_ext.extern两者有其优先级。
"payload":
"ext":
"em_apns_ext":
"em_push_title":"您有一条新消息",
"em_push_content":"您有一条新消息",
"test1":"1",
"test2":"2",
"extern":
"test3":"3",
"test4":"4"
自定义负载支持方式为,主动构建如下结构
"t":"toUsename",
"f":"fromUsername",
"m":"msg_id",
"g":"group_id",
"e":
1、当extern不存在时,e内容为em_apns_ext下push服务未使用字段。具体为移除em_push_title,em_push_content,em_push_name,em_push_channel_id,em_huawei_push_badge_class字段后剩余所有。如上则为
"e":"test1":"1","test2":"2"
2、当extern存在时,使用extern下字段。如上则为
"e":"test1":"3","test2":"4"
44.发送语音消息,想要吧amr修改成wav
回答:可以在录制的时候去修改EaseVoiceRecorder
45.用户隐私协议
回答:用户隐私协议 - 环信
方案:需要将第三方的初始化写在application的public方法中,加一个判断,判断是 第一次安装时,不初始化,当用户点击了同意协议之后,再执行application中的public的初始化。
46.聊天室异常退出2分钟才算离开聊天室,这个能缩短时间么?比如几秒钟
回答:可以设置成0,断线立刻退出聊天室(可以提工单让环信工作人员配置)
47.音视频聊天设置声音外放
protected void openSpeakerOn()
try
if (!audioManager.isSpeakerphoneOn())
audioManager.setSpeakerphoneOn(true);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
catch (Exception e)
e.printStackTrace();
48.发送图片成功后,如何获取发送的原图?
回答:1.需要在发送图片的时候设置发送原图;
2.发送图片成功后,可以获取到远程的服务器路径,获取到路径自己下载
49. 如何添加自定义的表情(类似于demo中的兔斯基)
回答:
1.在聊天页面( ChatFragment )中添加:
//添加扩展表情
chatLayout.getChatInputMenu().getEmojiconMenu().addEmojiconGroup(EmojiconExampleGroupData.getData());
2. 在applicaiton中注册一下Delegate。。
EaseMessageTypeSetManager.getInstance()
.addMessageType(EaseExpressionAdapterDelegate.class) //自定义表情
50.出现下图报报错
解决办法:升级一个根目录build.gradle 里面的classpath 'com.huawei.agconnect:agcp:1.4.1.300'
51. 在聊天页面不显示地图的图片?
回答:百度地图没有缩略图的api,如果使用高德的话,应该是可以的
52. 自定义的布局没有已读未读?
回答:需要去发送一个已读ack,参考 EaseTextViewHolder #handleReceiveMessage去写 。
53. 环信管理后台查询到replaced是什么意思?
回答:replaced在后台msync的定义就是旧连接被新连接踢掉了
54. 使用了极光的厂商推送,在环信中怎么使用?
回答:产生冲突的原因:极光和环信使用的都是厂商推送
(一)用户既使用环信的离线推送,又使用极光的厂商推送的情况下:
解决思路:
1.小米,vivo,oppo,魅族,华为需要在极光中获取到token时调用环信的api上传给环信;
2.在application中先初始化极光,再初始化环信(要保证环信的初始化是在主进程中);
3.通过EMOptions设置各个厂商的证书appId和appKey。
4.在配置清单中修改下各个厂商的service
(二)不使用环信的离线推送,可以开通实时回调功能,将离线消息都配置到客户的服务器,客户使用极光推给用户。
55. 离线推送可以跳转到指定的页面吗 ?
回答:小米的在onNotificationMessageClicked里去解析MiPushMessage的content,拿到对应字段去自行跳转页面
vivo的在onNotificationMessageClicked里解析UPSNotificationMessage,拿到对应字段去自行跳转页面
OPPO的跟华为是一样的,在启动页的onCreate里去获取参数跳转
默认点击打开应用首页,可以在客户端首页获取到。在onCreate里去调用
Bundle bundle = getIntent().getExtras();
if(bundle != null)
String f = bundle.getString("f");
String t = bundle.getString("t");
字段对应的含义
f:from
t:to
m:msgid
g:groupid
56. 看文档fcm集成成功了,怎么没有收到推送?
回答:fcm是唤醒应用,环信服务器会将离线消息下发给客户端,接收到消息之后,自己做本地通知 。
接收消息的监听:在application中初始化环信成功之后,注册一个接收消息的监听,自己做一个判断是否运行在后台,如果运行在后台,本地通知,https://docs-im.easemob.com/im/android/basics/message#接收消息
57、 安卓和ios音视频不通?
回答:看下安卓的sdk版本和ios的环信sdk版本,
3.7.5之前的版本使用的是环信的音视频,3.8.0之后的版本使用的是声网的音视频,需要确保各端在相同的版本下。
58. 在聊天页面点击大图崩溃?
回答:需要在配置清单中配置下EaseShowBigImageActivity。
android:screenOrientation="portrait"/>
59、Android端账号被踢下线,消息接收不到。
账号在其他设备上登录,将当前设备踢下线的时候,当前设备需要在监听到被踢的时候调用退出的api,并传false。
60、Android 11报崩溃异常,报错如下:
java.lang.RuntimeException:Unable to start receiver com.hyphenate.chat.EMMonitorReceiver: java.lang.IllegalStateException: Not allowed to start service Intent cmp=com.ant.health/com.hyphenate.chat.EMChatService : app is in background uid UidRecordab5b452 u0a320 RCVR idle change:uncached procs:1 seq(0,0,0)
A:去掉以下这几个方法,这几个方法对于安卓低版本保活的, 对于高版本 ,这个保活可以去掉。 高版本对保活有限制。
61、添加回调规则添加失败。
A:检查下回调规则名称是不是用的汉字,回调规则只能是数字、字母,不能用汉字。
62、对方离线了之后,发送的消息,上线后如何获取?
A:对方离线,消息会进入离线队列,如果没有集成第三方厂商离线推送,用户上线后,服务器下发给客户端。
63、调用SDK 方法报错: Cannot read property 'lookup' of undefined?
A:因为未登陆成功就调用了SDK 的api,需要在onOpened 链接成功回调执行后再去调用SDK 的api。
64、聊天室如何获取历史消息?
A:两种方式:1、环信服务器端主动推,需要联系商务开通服务,默认10条,数量可以调整。2、通过消息漫游接口自己去拉取历史消息,各端都有提供拉取漫游消息接口。
65、拉取消息漫游,conversationId是怎么获取的?
A:单聊的话,conversationId 就是对方用户的环信id。
群聊或聊天室的话,conversationId 就是groupid 或者chatroomid。
66、如何实现只有好友才可以发消息?
A:可以使用环信的发送前回调服务,消息先回调给配置的回调服务器,然后去判断收发双方是否是好友关系,如果是好友关系,那么下发消息,如果是非好友关系,则不下发消息,客户端ui可以根据不下发返回的code做提示。
67、调rest接口报401是什么原因?
A:调环信rest接口,需要管理员权限的token,确认下请求是否有token,且是在有效期,token的有效期以请求时服务器返回的时间为准。
68、调修改群信息报错如下
System.Net.WebException:“远程服务器返回错误: (400) 错误的请求。
A:检查下请求体,看下参数格式是否正确,比如"membersonly",,"allowinvites" 这两个参数的值为布尔值。
69、注册用户username是纯数字可以吗。
调restapi是可以的,serversdk的话,为了让用户使用更规范的名字,命名规则更严格一些,要求首位是字母。
以上是关于环信IM集成指南Android 端常见问题整理的主要内容,如果未能解决你的问题,请参考以下文章