Android 環信 訊息免打擾 實現
阿新 • • 發佈:2019-01-03
先上圖。
實現方式很簡單,設定為免打擾的群,去掉訊息提醒(環信接收訊息的回撥中處理),然後訊息數用淺藍色圓點並且在不包含在左下角的訊息總數中。
下面貼程式碼:
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、。。。。
沒了~~~