- 背景:**
我已经能够实现一对一聊天通过XMPP
在android使用asmack
库。我能够发送存在到服务器以及。我正在使用OpenFire
服务器为我的聊天为基础的应用程序。
- 问题:**我使用
connection.addPacketListener(new PacketListener()
接收消息和IQ数据包,对于消息数据包,我将其分类如下
- 问题:**我使用
PacketFilter Chatfilter = new MessageTypeFilter(Message.Type.chat);
connection.addPacketListener(new PacketListener() {
public void processPacket(Packet packet) {
Message message = (Message) packet;
if (message.getBody() != null) {
String fromName = StringUtils.parseBareAddress(message.getFrom());
Log.i("XMPPClient", "Got text [" + message.getBody() + "] from [" + fromName + "]");
messages.add(fromName + ":");
m1=message.getBody();
messages.add(message.getBody());
// Add the incoming message to the list view
/* mHandler.post(new Runnable() {
public void run() {
setListAdapter();
recieve.setText(m1);
}
});*/
}
}
}, Chatfilter);
它工作正常,但是**当我使用类似的东西来接收IQ数据包时,**出现了问题
这是我用来接收IQ数据包的代码
PacketFilter Iqfilter = new IQTypeFilter(IQ.Type.RESULT);
connection.addPacketListener(new PacketListener() {
public void processPacket(Packet packet) {
IQ iq = (IQ) packet;
String fromName = StringUtils.parseBareAddress(iq.getFrom());
Log.i("XMPPClient", "Got text [" + iq.toString() + "] from [" + fromName + "]");
m1=iq.getFrom();
mHandler.post(new Runnable() {
public void run() {
setListAdapter();
recieve.setText(m1);
}
});
}
}, Iqfilter);
我正在发送一个简单的disco#items
查询,但它没有响应,甚至没有进入函数,我也尝试过调试它,我还尝试过发送简单的PING
命令,但它也没有响应。我错过了什么?
其次,我也面临着向服务器或其他客户端发送IQ数据包的问题。我在某个地方读到过,我应该这样做。但它不起作用。
final IQ iq = new IQ() {
public String getChildElementXML() {
return "<query xmlns='http://jabber.org/protocol/disco#info'/>"; // here is your query
//this returns "<iq type='get' from='User@YourServer/Resource' id='info1'> <query xmlns='http://jabber.org/protocol/disco#info'/></iq>";
}};
// set the type
iq.setType(IQ.Type.GET);
// send the request
connection.sendPacket(iq);
令人困惑的事情是,当我读XMPP和asmack的Android文档时,它被写为要发送IQ,您需要有接收者的地址。但在此代码中,我们没有设置任何接收者。
有更少的信息可在互联网上的XMPP asmack和Android。
3条答案
按热度按时间o75abkj41#
我认为问题是你的提供者没有注册。请看一下this。在Android上,你必须在建立XMPP连接之前手动注册提供者。将下面的类复制到你的项目中
如下所示调用此方法
因此,请尝试在应用启动时或建立连接之前调用此方法。
希望这能帮上忙
r6l8ljro2#
当发送自定义消息时,例如,
您需要定义自己的IQ并发送此IQ:
4dc9hkyq3#
对于sent out,实际上只需要构造xml字符串并在
getChildElementXML()
中返回,不需要其他设置。正如这篇博客文章中提到的:https://billynyh.github.io/blog/2014/09/28/android-xmpp-dev/
要接收IQ响应,首先需要创建IQProvider并添加到ProviderManager中,匹配查询对象中的xmlns。IQProvider用于将响应数据包转换为自定义的IQ对象。然后需要扩展PacketListener,并在创建连接对象时添加侦听器,并使用PacketTypeFilter匹配IQ类。如果提供者和侦听器都设置正确,你应该能够接收到智商的React。