如何使用SmackJava获取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

事实上,问题是当我的xmpp客户端发送朋友邀请,然后收件人已经批准了邀请,openfire服务器再次向发起人/邀请发件人推送一个订阅包以进行授权,这就是为什么我想通过使用IQ标记自动筛选它,然后自动授权它来防止出现这种情况

但是有了PacketListener,我无法得到IQ标签

我该怎么做

@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信息