1. 程式人生 > >Android 環信 訊息免打擾 實現

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、。。。。


沒了~~~