需求背景:
點擊發送消息時先檢查消息內容合不合規或者用戶有沒有權利發送
難點:
找不到發送按鈕或者說監聽不到點擊發送觸發了什麼事件,後面想就算監聽到也沒用,因爲發送語言消息和圖片消息根本不經過發送按鈕
解決方案:
1.在消息發送監聽裏面做操作,即RongIM.OnSendMessageListener
這個監聽有兩個回調,一個是消息發送前,一個是消息成功發送後
public interface OnSendMessageListener {
Message onSend(Message var1);
boolean onSent(Message var1, RongIM.SentMessageErrorCode var2);
}
2.在1的前提下,因爲請求接口是異步,返回又是同步的。所有需要異步後先返回null,然後在請求完接口裏面再幫它重新發送消息並標記該消息,它會再次走消息監聽,這時判斷標記,能發就不走異步接口了,直接返回message。這樣消息就發送出去了
具體場景使用代碼:
//監聽信息發送
RongIM.getInstance().setSendMessageListener(new MySendMessageListener());
private class MySendMessageListener implements RongIM.OnSendMessageListener {
/**
* 消息發送前監聽器處理接口(是否發送成功可以從 SentStatus 屬性獲取)。
*
* @param message 發送的消息實例。
* @return 處理後的消息實例
*/
@Override
public Message onSend(Message message) {
//請求接口成功後會加上message.setExtra("isCanSend")
if (message.getExtra() != null && message.getExtra().equals("isCanSend")){
return message;
} else {
getPresenter().chatSendCheck(toUserId, message);
return null;
}
}
/**
* 消息在 UI 展示後執行/自己的消息發出後執行,無論成功或失敗。
*
* @param message 消息實例。
* @param sentMessageErrorCode 發送消息失敗的狀態碼,消息發送成功 SentMessageErrorCode 爲 null。
* @return true 表示走自己的處理方式,false 走融雲默認處理方式。
*/
@Override
public boolean onSent(Message message, RongIM.SentMessageErrorCode sentMessageErrorCode) {
return false;
}
}
getPresenter().chatSendCheck的請求網絡接口如下:
public void chatSendCheck(int toUserId, final Message message) {
HttpUtils.request(getIView(), new ChatSendCheckApi(toUserId, type, content), new HttpOnNextListener<ChatSendCheckResult>() {
@Override
public void onNext(ChatSendCheckResult result) {
switch (result.getData().getStatus()) {
case 0:
message.setExtra("isCanSend");
if (type == 2){
//發圖片要用sendImageMessage,否則對方查看不了
RongIM.getInstance().sendImageMessage(message, null, null, false, null);
} else {
RongIM.getInstance().sendMessage(message, null, null, null, null);
}
break;
default:
ToastUtils.showBottomLong(result.getData().getMsgX());
}
}
@Override
public void onDealCodeNext(ChatSendCheckResult baseResult) {
super.onDealCodeNext(baseResult);
getIView().toast(baseResult.getMsg());
}
@Override
public void onError(ApiException e) {
super.onError(e);
getIView().toast(BaseSPUtils.getToastErrorMsg());
}
@Override
public void onFinish() {
super.onFinish();
}
});
}
有些變量沒給出。但它已經是個完整的流程代碼了。
還有疑問請私信我。