使用smack在消息传递应用程序中实现接收器状态(读取或输入)

时间:2018-12-06 08:22:33

标签: android smack instant-messaging

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

1 个答案:

答案 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