输入状态提示


输入状态提示:当A用户正在输入文字的时候,聊天的对方可以收到用户A正在输入的提示。

输入状态提示

监听用户A输入状态,一旦有文字输入,就每隔几秒通过透传消息将输入状态发送到聊天接受方B,B客户端收到输入状态透传后,提示用户A正在输入。

  1. 用户A向用户B发一条表示输入状态透传消息。
  2. 用户B在收到消息后,判断当前是否在与A聊天的页面,如果在,显示A的输入状态。
  3. 当隔几秒后没有再次收到A的输入状态,自动取消显示。

注:“透传消息”是一种特殊类型的消息,收发双方不会存数据库,同时用户离线时也不会有推送,比较适合配合业务来处理一些功能。

注意:

A用户不需要不停的向B发送消息,可以设置一个时间,判断发送间隔。

Android示例

public int time = 5000;//按照自己的需求自定义时间间隔发送状态消息(单位:ms)
public long firstTime =  System.currentTimeMillis();//文本框第一次输入内容变化的时间
    
EditText.addTextChangedListener(new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (System.currentTimeMillis()-firstTime > time) {
            sendInputmsg();
            firstTime = System.currentTimeMillis();
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
});	
    
public void sendInputmsg(){
    
    EMMessage cmdMsg = EMMessage.createSendMessage(EMMessage.Type.CMD);
    // 如果是群聊,设置chattype,默认是单聊
    if (chatType == CHATTYPE_GROUP){
        cmdMsg.setChatType(ChatType.GroupChat);
    }
    String action="input";
    CmdMessageBody cmdBody=new CmdMessageBody(action);
    // 设置消息body
    cmdMsg.addBody(cmdBody);
    // 设置要发给谁,用户username或者群聊groupid
    cmdMsg.setReceipt(toChatUsername);
        
    EMChatManager.getInstance().sendMessage(cmdMsg,new EMCallBack() {
        @Override
        public void onSuccess() {}
                
        @Override
        public void onProgress(int progress, String status) {}
                    
        @Override
        public void onError(int code, String error) {}
    });
}

iOS示例

#define TIME_FLAG 5 			// 时间阀值
#define INPUT_FLAG @"input" 		// 透传消息关键字

- (void)sendInputMsg{
    if ([self isCanSendInputMsg]) {
        EMChatCommand *inputCommand = [[EMChatCommand alloc] init];
        inputCommand.cmd = INPUT_FLAG;	// 当前cmd消息的关键字
    	EMCommandMessageBody *inputMsgBody = [[EMCommandMessageBody alloc] initWithChatObject:inputCommand];
    EMMessage *inputMsg = [[EMMessage alloc] initWithReceiver:@"接收方id" bodies:@[inputMsgBody]];
    	inputMsg.messageType = eMessageTypeChat;  // 单聊
        [[EaseMob sharedInstance].chatManager asyncSendMessage:inputMsg progress:nil];
    }
}

- (BOOL)isCanSendInputMsg{
    NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970];
    // _time 全局变量,记录时间
    if (currentTime - _time > TIME_FLAG) {
        _time = [[NSDate date] timeIntervalSince1970];
        return YES;
    }
    return NO;
}

// 当文字变化会执行该方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    [self sendInputMsg];
    return YES;
}

Android示例

EMChatManager.getInstance().registerEventListener(new EMEventListener() {
            
    @Override
    public void onEvent(EMNotifierEvent event) {
        switch (event.getEvent()) {
        case EventNewCMDMessage: // CMD消息
        {
            EMMessage message = (EMMessage) event.getData();
            CmdMessageBody cmdMsgBody = (CmdMessageBody) message.getBody();
            String aciton = cmdMsgBody.action;//获取自定义action
            if(action.equals("input")){
                //update UI
            }
            break;
        }
        default:
            break;
        }			
    }
}, new EMNotifierEvent.Event[] { EMNotifierEvent.Event.EventNewCMDMessage});

iOS示例

- (void)didReceiveCmdMessage:(EMMessage *)cmdMessage{
    EMCommandMessageBody *body = cmdMessage.messageBodies.firstObject;
    if ([body.action isEqualToString:INPUT_FLAG]) {
       // update ui
    }
}

上一页:消息回撤

下一页:实时位置共享