融雲發送消息前先接口檢查

需求背景:

點擊發送消息時先檢查消息內容合不合規或者用戶有沒有權利發送

難點:

找不到發送按鈕或者說監聽不到點擊發送觸發了什麼事件,後面想就算監聽到也沒用,因爲發送語言消息和圖片消息根本不經過發送按鈕

解決方案:

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();

        }
    });
}

有些變量沒給出。但它已經是個完整的流程代碼了。
還有疑問請私信我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章