目录

输入状态提示


输入状态提示:当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"         // 透传消息关键字

long long _time = 0;

- (void)sendInputMsg:(NSString *)conversationId {
    if ([self isCanSendInputMsg]) {
        EMCmdMessageBody *body = [[EMCmdMessageBody alloc] initWithAction:INPUT_FLAG];
        NSString *currentUsername = [EMClient sharedClient].currentUsername;
        EMMessage *inputMsg = [[EMMessage alloc] initWithConversationID:conversationId
                                                                   from:currentUsername
                                                                     to:conversationId
                                                                   body:body
                                                                    ext:nil];
        inputMsg.chatType = EMChatTypeChat;  // 单聊
        //发送cmd消息
        [[EMClient sharedClient].chatManager sendMessage:inputMsg
                                                progress:nil
                                              completion:^(EMMessage *message, EMError *error) {
                                                  if (!error) {
                                                      NSLog(@"发送成功");
                                                  }
                                              }
         ];
    }
}

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

// UITextView回调方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    [self sendInputMsg:self.conversation.conversationId];
    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)cmdMessagesDidReceive:(NSArray *)aCmdMessages {
    [aCmdMessages enumerateObjectsWithOptions:NSEnumerationReverse
                                   usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                                       if ([obj isKindOfClass:[EMMessage class]]) {
                                           EMMessage *cmdMessage = (EMMessage *)obj;
                                           EMCmdMessageBody *body = (EMCmdMessageBody *)cmdMessage.body;
                                           if ([body.action isEqualToString:@"input"]) {
                                               *stop = YES;
                                               // update ui
                                           }
                                       }
                                   }
     ];
}

上一页:消息回撤

下一页:实时位置共享