如何使用SmackJava获取IQ标签?
事实上,问题是当我的xmpp客户端发送朋友邀请,然后收件人已经批准了邀请,openfire服务器再次向发起人/邀请发件人推送一个订阅包以进行授权,这就是为什么我想通过使用IQ标记自动筛选它,然后自动授权它来防止出现这种情况 但是有了PacketListener,我无法得到IQ标签 我该怎么做如何使用SmackJava获取IQ标签?,java,xmpp,smack,Java,Xmpp,Smack,事实上,问题是当我的xmpp客户端发送朋友邀请,然后收件人已经批准了邀请,openfire服务器再次向发起人/邀请发件人推送一个订阅包以进行授权,这就是为什么我想通过使用IQ标记自动筛选它,然后自动授权它来防止出现这种情况 但是有了PacketListener,我无法得到IQ标签 我该怎么做 @Override public void processPacket(Packet packet) { Log.i(TAG, "SECOND subscription"); Log.d(T
@Override
public void processPacket(Packet packet) {
Log.i(TAG, "SECOND subscription");
Log.d(TAG, "SECOND: "+packet.toXML());
if (packet instanceof Presence) {
Presence p = (Presence) packet;
Log.d(TAG, "TYPE-Presence: "+p.getType());
if (p.getType() != Presence.Type.subscribe)
return;
String from = p.getFrom();
Log.d(TAG, "PACKET from: "+from);
Notification notification = new Notification(android.R.drawable.stat_notify_more, mService.getString(
R.string.AcceptContactRequest, from), System.currentTimeMillis());
notification.flags = Notification.FLAG_AUTO_CANCEL;
Intent intent = new Intent(mService, Subscription.class);
intent.setData(Contact.makeXmppUri(from));
notification.setLatestEventInfo(mService, from, mService
.getString(R.string.AcceptContactRequestFrom, from), PendingIntent.getActivity(mService, 0,
intent, PendingIntent.FLAG_ONE_SHOT));
int id = p.hashCode();
mService.sendNotification(id, notification);
}
}
可以使用“IQTypeFilter”过滤器过滤掉传入IQ。这是说明该方法的示例代码
connection.connect();
/* packet listener: listen for incoming messages of type IQ on the connection (whatever the buddy) */
PacketFilter filter = new IQTypeFilter(IQ.Type.SET); // or IQ.Type.GET etc. according to what you like to filter.
connection.addPacketListener(new PacketListener() {
public void processPacket(Packet packet) {
// HERE YOU PUT YOUR CODE TO HANDLE THE IQ MESSAGE
}
}, filter);
您可以通过使用IQTypeFilter来实现,IQTypeFilter是IQ数据包类型的过滤器:
public final class IQTypeFilter extends FlexibleStanzaTypeFilter<IQ> {
public static final StanzaFilter GET = new IQTypeFilter(Type.get);
public static final StanzaFilter SET = new IQTypeFilter(Type.set);
public static final StanzaFilter RESULT = new IQTypeFilter(Type.result);
public static final StanzaFilter ERROR = new IQTypeFilter(Type.error);
public static final StanzaFilter GET_OR_SET = new OrFilter(GET, SET);
private final IQ.Type type;
private IQTypeFilter(IQ.Type type) {
super(IQ.class);
this.type = Objects.requireNonNull(type, "Type must not be null");
}
@Override
protected boolean acceptSpecific(IQ iq) {
return iq.getType() == type;
}
@Override
public String toString() {
return getClass().getSimpleName() + ": type=" + type;
}
公共最终类IQTypeFilter扩展了FlexibleStanzaTypeFilter{
public static final StanzaFilter GET=新的IQTypeFilter(Type.GET);
公共静态最终节过滤器集=新IQTypeFilter(Type.SET);
公共静态最终节过滤器结果=新IQTypeFilter(Type.RESULT);
公共静态最终节筛选器错误=新IQTypeFilter(Type.ERROR);
公共静态最终节过滤器GET_或集合=新建或过滤器(GET,集合);
私人最终智商类型;
专用IQTYPE筛选器(IQ.Type){
超级(智商级);
this.type=Objects.requirennull(type,“type不能为null”);
}
@凌驾
受保护的布尔接受特定(IQ){
返回iq.getType()==type;
}
@凌驾
公共字符串toString(){
返回getClass().getSimpleName()+”:type=“+type;
}
正如Javadoc中定义的那样,IQTypeFilter是IQ数据包类型的过滤器。只有当数据包是IQ数据包并且它与构造函数中提供的类型匹配时,才会返回true。这里有一些关于的示例,这是使用Smack 4.3.4的更新答案。我明确地添加了注释,以使代码更清晰
/**
* packet listener: listen for incoming messages of whith IQ as elelement
* exmaple of IQ : <iq from="mbula@domain" to="dedi@domain" type="get" >.......</iq>
*/
public static void listenToStanzas(AbstractXMPPConnection connection){
// IQ filter type. it can Be GET, SET, RESULT, ERROR
//in my case I filter SET IQs
StanzaFilter filter = IQTypeFilter.SET;
connection.addSyncStanzaListener(new StanzaListener() {
@Override
public void processStanza(Stanza packet) {
//Put yoour code Here
}
}, filter);
}
/**
*数据包侦听器:侦听IQ为Element的传入消息
*智商学院院长:。。。。。。。
*/
公共静态void listenToStanzas(AbstractXMPPConnection){
//IQ过滤器类型。它可以是获取、设置、结果、错误
//在我的情况下,我过滤设置IQ
StanzaFilter filter=IQTypeFilter.SET;
connection.addSyncStanzaListener(新的StanzaListener(){
@凌驾
公共无效处理节(节数据包){
//把代码放在这里
}
},过滤器);
}
你能详细解释一下你的答案吗?实际上我不知道如何处理IQ信息