输入状态提示


输入状态提示:当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
    }
}

上一页:消息回撤

下一页:实时位置共享