我正在使用smack库和openfire作为服务器在android中创建即时消息传递应用程序,但是我无法实现当前用户正在与之交谈的人的功能。例如,当用户阅读消息或开始输入消息时。 有没有什么办法可以通过sm或其他方式来实现?
答案 0 :(得分:0)
要知道哪个用户是当前用户,必须在逻辑中实现自己的用户。您必须使用Roster
(xmpp服务器中的联系人列表)来获取当前用户的联系人并将其保存在数据库或其他位置。然后创建一个活动以在列表中显示联系人。每个联系人都有一个独特的jid
,可以与其他联系人区分开。因此,通过单击每个联系人,将其对象(包括jid)发送到聊天活动。在聊天活动中,您必须从数据库或MAM(服务器中的存档消息)中获取以前的消息,并且可以向当前联系人发送消息(将联系人的ID设置为To
)。
要实现邮件传递,您必须使用this link。您可以使用以下代码设置请求:
Message message = … //make your stanza
DeliveryReceiptRequest.addTo(message); //add delivery request to message
connection.sendStanza(message); //send message
然后您将收到带有以下代码的交货通知:
private void setDelRecListener() {
DeliveryReceiptManager d = DeliveryReceiptManager.getInstanceFor(connection);
d.addReceiptReceivedListener(new ReceiptReceivedListener() {
@Override
public void onReceiptReceived(Jid fromJid, Jid toJid, String receiptId, Stanza receipt) {
Msg msg = F.getMsgBySid(receiptId);
if (msg == null)
return;
Boolean isUpdated = F.setMsgDelivered(msg);
Log.i("m/serv/UpdateDelivery", "for: " + receiptId + (isUpdated ? " Founded&Updated" : " NotFounded"));
if (isUpdated) {
BCTool.notifyPMDelivered(msg.id, msg.conv.frnd.getBareJid());
}
}
});
}
请记住,每个节都有一个sid
(节ID),发送成功后,必须将每个相应的sid保存到数据库中的消息模型。这样,您可以检测到收到的邮件。
-要发送诸如composing
之类的聊天状态,您可以使用以下方法:
public void sendChatState(String _jid, ChatState chatState) {
try {
Message msg = new Message();
msg.addExtension(new ChatStateExtension(chatState));
msg.setTo(JidCreate.bareFrom(_jid));
msg.setType(Message.Type.chat);
connection.sendStanza(msg);
Log.e("m/service", "ChatStateSent");
} catch (SmackException.NotConnectedException | InterruptedException | XmppStringprepException e) {
Log.e("m/service", "ChatState Not Sent: " + e.getMessage());
e.printStackTrace();
}
}
您必须设置一个计时器以防止在接下来的5秒内发送composing
,并在键入字符时重置计时器。
考虑阅读以下内容:ChatStateNotifications