我如何在 smack openfire android 中监听传入的订阅请求

Posted

技术标签:

【中文标题】我如何在 smack openfire android 中监听传入的订阅请求【英文标题】:How can i listen incoming subscription request in smack openfire android 【发布时间】:2016-10-23 18:01:13 【问题描述】:

我正在使用 smack open fire 创建一个 android 聊天应用程序。我面临的问题是我知道如何发送和接受订阅请求,但我怎么知道我是否收到了任何订阅请求。 我使用了 Stanza 监听器,但监听器只监听传入的聊天消息,而不是订阅请求。 下面是我的代码

StanzaFilter filter=new StanzaTypeFilter(Message.class);
        PacketCollector collector=connection.createPacketCollector(filter);
        connection.addAsyncStanzaListener(new StanzaListener() 
            @Override
            public void processPacket(Stanza packet) throws SmackException.NotConnectedException 
                Log.wtf("MA","Stanz listner");
            
        ,filter);

我是 smack 的初学者,请帮助我如何收听传入的订阅请求。提前致谢。

【问题讨论】:

何时向该用户发送订阅请求?这个“Stanz listner”不会打印在日志中? StanzaTypeFilter 将实现一个函数 'accept' 你返回了什么? 我只是使用这个模块来收听传入的订阅..我错了吗?如果我错了,你能告诉我我应该在那里写什么而不是节过滤器..提前谢谢 这应该可以。只需删除 packetCollector 行,我猜你的代码中不需要这个。 【参考方案1】:

订阅请求不是Message。它是Presence

所以,你可能应该试试:

StanzaFilter filter = new StanzaTypeFilter(Presence.class);

参考:RFC 3921 - Section 6 - Managing Subscriptions

【讨论】:

【参考方案2】:

这就是我在我的android代码中所做的

StanzaFilter subscribefilter = PresenceTypeFilter.SUBSCRIBE;
PresenceSubscribeListener subscribeListener = new PresenceSubscribeListener(context.getApplicationContext(), connection);
connection.addSyncStanzaListener(subscribeListener, subscribefilter);

然后这个连接对象已经在 Android 中一个长期运行的服务中被引用。这样做是为了当您的应用在后台接收数据包时,您仍然可以处理传入的在线状态数据包。

附:我在我的 android 代码中使用 smack 4.1.9。

【讨论】:

以上是关于我如何在 smack openfire android 中监听传入的订阅请求的主要内容,如果未能解决你的问题,请参考以下文章

Openfire:在android上使用smack向特定人广播消息

如何使用 Smack 在 XMPP openfire 中了解打字状态

如何使用 Smack 在 XMPP openfire 中了解打字状态

如何在 Android 应用中使用 Smack 从 Openfire 服务器恢复两个用户之间的聊天记录

我如何在 smack openfire android 中监听传入的订阅请求

如何使用 smack 和 openfire 获取 IOS 中每个聊天会话的最后一条消息?