技术原理
实现过程
前提条件
发送输入状态的透传消息
// 设置透传消息发送间隔。默认为 5000 毫秒,即 5 秒。
private static final int INPUT_STATUS_INTERVAL = 5000;
private long lastSendTime = 0;
// 假设 editText 是你的输入框
EditText editText = findViewById(R.id.edit_text);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
long currentTime = System.currentTimeMillis();
// 限制发送频率
if (currentTime - lastSendTime > INPUT_STATUS_INTERVAL) {
sendInputStatusMessage();
lastSendTime = currentTime;
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {}
});
private void sendInputStatusMessage() {
String action = "input_status";
// 创建透传消息
EMMessage cmdMsg = EMMessage.createSendMessage(EMMessage.Type.CMD);
EMCmdMessageBody cmdBody = new EMCmdMessageBody(action);
// 将该透传消息只发送给在线用户
cmdBody.deliverOnlineOnly(true);
cmdMsg.addBody(cmdBody);
// 设置接收方(toChatUsername 为当前聊天对象的环信用户 ID)
cmdMsg.setTo(toChatUsername);
cmdMsg.setChatType(EMMessage.ChatType.Chat);
// 发送消息
EMClient.getInstance().chatManager().sendMessage(cmdMsg);
}接收和解析透传消息
// 用于处理自动隐藏输入状态的 Handler
private Handler inputStatusHandler = new Handler(Looper.getMainLooper());
private Runnable hideInputStatusRunnable = new Runnable() {
@Override
public void run() {
// 隐藏"对方正在输入..."提示
// 例如:inputStatusTextView.setVisibility(View.GONE);
}
};
EMMessageListener msgListener = new EMMessageListener() {
@Override
public void onCmdMessageReceived(List<EMMessage> messages) {
for (EMMessage message : messages) {
EMCmdMessageBody cmdBody = (EMCmdMessageBody) message.getBody();
String action = cmdBody.action();
if ("input_status".equals(action)) {
// 使用 Handler 在主线程更新 UI
inputStatusHandler.post(new Runnable() {
@Override
public void run() {
// 显示"对方正在输入..."提示
// 例如:inputStatusTextView.setVisibility(View.VISIBLE);
// 例如:inputStatusTextView.setText("对方正在输入...");
}
});
// 移除之前的自动隐藏任务,重新计时
inputStatusHandler.removeCallbacks(hideInputStatusRunnable);
// 5 秒后自动隐藏输入状态提示
inputStatusHandler.postDelayed(hideInputStatusRunnable, 5000);
}
}
}
// 其他回调方法...
@Override
public void onMessageReceived(List<EMMessage> messages) {}
@Override
public void onMessageRead(List<EMMessage> messages) {}
@Override
public void onMessageDelivered(List<EMMessage> messages) {}
@Override
public void onMessageRecalledWithExt(List<EMRecallMessageInfo> recallMessageInfo) {}
@Override
public void onMessageChanged(EMMessage message, Object change) {}
};
EMClient.getInstance().chatManager().addMessageListener(msgListener);注意事项
// 在 Activity 中
@Override
protected void onDestroy() {
// 移除消息监听器
if (msgListener != null) {
EMClient.getInstance().chatManager().removeMessageListener(msgListener);
}
// 清理 Handler 回调(针对输入状态提示功能)
if (inputStatusHandler != null) {
inputStatusHandler.removeCallbacksAndMessages(null);
}
super.onDestroy();
}


