先上图。
实现方式很简单,设置为免打扰的群,去掉消息提醒(环信接收消息的回调中处理),然后消息数用浅蓝色圆点并且在不包含在左下角的消息总数中。
下面贴代码:
1、EaseSharedUtils
放在easeui
库的utils
包下
用于设置免打扰,消息列表的adapter中也根据这个来判断用红点还是蓝点,这部分代码就不贴了自己处理。
public class EaseSharedUtils {
private static SharedPreferences sha;
public static SharedPreferences getCacheShared(Context context) {
if (sha == null) {
sha = context.getSharedPreferences("cache", 0);
}
return sha;
}
/**
* 群组收到消息是否允许响铃
* false为不允许响铃,即开启了免打扰
* uid:当前环信用户账号
* groupId:目标群组id
*/
public static boolean isEnableMsgRing(Context context, String uid, String groupId) {
return getCacheShared(context).getBoolean(uid + "_" + groupId, true);
}
/**
* 设置是否允许响铃,true允许
*/
public static void setEnableMsgRing(Context context, String uid, String groupId, boolean enable) {
SharedPreferences.Editor editor = getCacheShared(context).edit();
editor.putBoolean(uid + "_" + groupId, enable);
editor.apply();
}
}
2、修改easeui
库utils/EaseCommonUtils
中的isSilentMessage()
修改此方法后设置为免打扰的群组就不会响铃或震动。
修改如下:
/**
* \~chinese
* 判断是否是免打扰的消息,如果是app中应该不要给用户提示新消息
* \~english
* check if the message is kind of slient message, if that's it, app should not play tone or vibrate
*/
public static boolean isSilentMessage(Context context, EMMessage message) {
return message.getChatType() == EMMessage.ChatType.GroupChat &&
!EaseSharedUtils.isEnableMsgRing(context, EMClient.getInstance().getCurrentUser(), message.getTo());
}
3、修改左下角消息总数(不计算免打扰消息数)
环信有提供获取消息总数的方法
EMClient.getInstance().chatManager().getUnreadMessageCount();
但这个方法得到的是所有未读消息数,而我们想要的是不包括免打扰的。
我们点击getUnreadMessageCount()
进去看环信怎么实现的
环信实现如下
public int getUnreadMessageCount() {
List var1 = this.emaObject.getConversations();
int var2 = 0;
Iterator var3 = var1.iterator();
while(var3.hasNext()) {
EMAConversation var4 = (EMAConversation)var3.next();
if(var4._getType() != EMAConversationType.CHATROOM) {
var2 += var4.unreadMessagesCount();
}
}
return var2;
}
可以看到环信是通过emaObject
获取到所有会话,循环计算每个会话的未读消息数。
这样就有办法修改了,用emaObject
对象,拿到所有会话,循环判断是不是免打扰的会话,自己计算总数量。
问题又来了,EMAChatManager emaObject;
是default类型,不能直接获取到对象
怎么办,反射呗
获取未读总数代码如下,项目用kotlin写的,用Java的同学自己翻译吧:)
private fun getUnreadMessageCount(): Int {
val emaObject = DataTool.getSpecifiedFieldObject(EMClient.getInstance().chatManager(),
"emaObject") as EMAChatManager
val var1 = emaObject.conversations
var unRead = 0
val var3 = var1.iterator()
while (var3.hasNext()) {
val conversation = var3.next() as EMAConversation
if (conversation._getType() != EMAConversation.EMAConversationType.CHATROOM &&
EaseSharedUtils.isEnableMsgRing(this, EMClient.getInstance().getCurrentUser(),conversation.conversationId())) {
unRead += conversation.unreadMessagesCount()
}
}
return unRead
}
DataTool.getSpecifiedFieldObject()
/**
* 反射获取指定字段对象
*/
public static Object getSpecifiedFieldObject(Object obj, String fieldName) {
Class<?> clazz = obj.getClass();
Object object = null;
try {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
object = field.get(obj);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return object;
}
4、。。。。
没了~~~