技術原理
實現過程
前提條件
發送輸入狀態的透傳消息
// 設置透傳消息發送間隔。默認為 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();
}


