Android 环信 消息免打扰 实现

先上图。

实现方式很简单,设置为免打扰的群,去掉消息提醒(环信接收消息的回调中处理),然后消息数用浅蓝色圆点并且在不包含在左下角的消息总数中。



下面贴代码:


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、修改easeuiutils/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、。。。。



没了~~~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值