需求背景:
点击发送消息时先检查消息内容合不合规或者用户有没有权利发送
难点:
找不到发送按钮或者说监听不到点击发送触发了什么事件,后面想就算监听到也没用,因为发送语言消息和图片消息根本不经过发送按钮
解决方案:
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();
}
});
}
有些变量没给出。但它已经是个完整的流程代码了。
还有疑问请私信我。