美文网首页Android开发
融云发送消息前先接口检查

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

作者: 你的益达233 | 来源:发表于2021-11-15 16:03 被阅读0次
    需求背景:

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

    难点:

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

    解决方案:

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

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

    相关文章

      网友评论

        本文标题:融云发送消息前先接口检查

        本文链接:https://www.haomeiwen.com/subject/zheqtrtx.html