融云发送消息前先接口检查

需求背景:

点击发送消息时先检查消息内容合不合规或者用户有没有权利发送

难点:

找不到发送按钮或者说监听不到点击发送触发了什么事件,后面想就算监听到也没用,因为发送语言消息和图片消息根本不经过发送按钮

解决方案:

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

        }
    });
}

有些变量没给出。但它已经是个完整的流程代码了。
还有疑问请私信我。

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