gpt4 book ai didi

android - 使用 smack 在消息传递应用程序中实现接收者状态(读取或键入)- Android

转载 作者:行者123 更新时间:2023-11-30 05:11:31 24 4
gpt4 key购买 nike

我正在使用 smack 库和 openfire 作为服务器在 android 中创建一个即时消息传递应用程序,但我无法实现当前用户与之交谈的人的功能。即就像用户阅读消息或开始输入时一样。有什么方法可以使用 smack 或其他方法来实现吗?

最佳答案

要了解哪个用户是当前用户,您必须在您的逻辑中实现您自己的。您必须使用 Roster(xmpp 服务器中的联系人列表)来获取当前用户的联系人并将它们保存在数据库或其他地方。然后创建一个 Activity 以在列表中显示联系人。每个联系人都有一个唯一的jid,可以通过它与其他联系人区分开来。因此,点击每个联系人,将其对象(包括 jid)发送到聊天 Activity 。在聊天 Activity 中,您必须从数据库或 MAM(服务器中的存档消息)获取以前的消息,并且您可以向当前联系人发送消息(将联系人 jid 设置为 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

关于android - 使用 smack 在消息传递应用程序中实现接收者状态(读取或键入)- Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53647233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com