在 Android 上使用 aSmack 发送和接收自定义 XMPP IQ
Posted
技术标签:
【中文标题】在 Android 上使用 aSmack 发送和接收自定义 XMPP IQ【英文标题】:Sending and Receiving custom XMPP IQs with aSmack on Android 【发布时间】:2014-03-14 12:46:00 【问题描述】:背景:
我已经在 android 上使用 aSmack for XMPP 实现了一对一聊天。我还能够发送和接收 IQ 消息。
问题是:
我无法发送和接收自定义 IQ 消息。例如,如果我想发送一个 IQ
<iq type='get'
to='ssmack@web.mystudios.com/mack'>
<query xmlns='http://jabber.org/protocol/disco#items'/>
</iq>
aSmack 适用于此 IQ,因为它不是自定义的,但如果我将此处的 name space
从 disco#items
更改为 Match
,它将无法正常工作,它将向服务器发送一条响应声明
<error code='503'
type='cancel'>
<service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
此响应是从我的客户发送的。但我试图调试它,我在所有接收和发送数据包的代码上都设置了断点。但它没有进入那里。
我接收数据包的代码是:
connection.addPacketListener(new PacketListener()
@Override
public void processPacket(Packet p)
// TODO Auto-generated method stub
String fromName1 = StringUtils.parseBareAddress(p.getFrom());
Log.i("XMPPClient", "Got text [" + p.toXML() + "] from [" + fromName1 + "]");
m1=p.getFrom();
mHandler.post(new Runnable()
public void run()
setListAdapter();
recieve.setText(m1);
);
我想我需要添加一些侦听器来获取自定义响应。有人可以指导我吗?
【问题讨论】:
@Flow 我在 android 设备上使用 asmack 从 xmpp 服务器发送和接收消息时遇到问题,你能过来这个link 帮助我吗,谢谢 我在 android 设备上使用 asmack 从 xmpp 服务器发送和接收消息时遇到问题,你能过来这个link 帮助我吗,谢谢 【参考方案1】:代码不完整。 addPacketListener()
接受两个参数。
我怀疑您没有在接收方为自定义 IQ 注册提供程序,这就是它返回 <service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
的原因
您可能想阅读一些文档:
Provider Architecture: Packet Extensions and Custom IQ's Brief Tutorial on IQ Providers【讨论】:
当我尝试使用相同的代码接收正常的智商时。有用。当我尝试接收 disco#items 时,它可以工作,但是当我输入自定义名称空间时,会生成以下错误 如何在接收方注册自定义 IQ 提供者?【参考方案2】:您需要使用ServiceDiscoveryManager 并像这样注册您的自定义命名空间:
ServiceDiscoveryManager sm = ServiceDiscoveryManager.getInstanceFor(connection);
sm.addFeature("your:namespace");
查看Smack sources,所有内部 IQ 处理程序都将自己添加为功能,按名称空间匹配传入的查询数据包并构建结果或错误回复。
【讨论】:
你能引用一个编码的例子吗..? ServiceDiscoveryManager.addfeature? 以及我需要在哪里调用这个函数。在发送数据包之前? 我已经添加了示例代码,还检查了指向 ServiceDiscoveryManager 参考的链接,有一个注释可以更好地调用addFeature
缺少特征定义不会导致所描述的问题。以上是关于在 Android 上使用 aSmack 发送和接收自定义 XMPP IQ的主要内容,如果未能解决你的问题,请参考以下文章
Android aSmack - 如何为文件发送自定义消息扩展名?
无法在 Android 上使用 asmack 登录 Facebook