Как получить тег IQ, используя привкус Java? - PullRequest
1 голос
/ 18 марта 2012

На самом деле проблема в том, что мой 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);
    }
}

Ответы [ 3 ]

3 голосов
/ 07 апреля 2012

Входящие IQ могут быть отфильтрованы с помощью фильтра "IQTypeFilter".Это пример кода, который иллюстрирует метод.

    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);  
0 голосов
/ 29 июня 2018

Как определено в Javadoc, IQTypeFilter - это фильтр для типов пакетов IQ. Возвращает true, только если пакет является пакетом IQ и соответствует типу, указанному в конструкторе. Есть несколько примеров использования IQTypeFilter

0 голосов
/ 27 июня 2018

Этого можно добиться с помощью 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;
    }
...