3

asmack-android-17-0.8.3私のAndroidプロジェクトに使用しています。

asmack ソースをプロジェクトにコピーし、次のように ConfigureProviderManager クラスにカスタム IQ プロバイダーを追加しました。

other extensions and IQ providers...

// XEP-184 Message Delivery Receipts
    pm.addExtensionProvider("received", "urn:xmpp:receipts", new DeliveryReceipt.Provider());
    pm.addExtensionProvider("request", "urn:xmpp:receipts", new DeliveryReceipt.Provider());

    // XEP-0115 Entity Capabilities
    pm.addExtensionProvider("c", "http://jabber.org/protocol/caps", new CapsExtensionProvider());

    // XEP-0136
    pm.addIQProvider("list", "urn:xmpp:archive", new ListIQProvider());

ご覧のとおり、最も重要な点として、XEP-0136 でのアーカイブをサポートするために IQProvider を追加しました!

これを追加すると、アーカイブされたチャット データを iq プロバイダーに取得できますが、残念ながら同時に、クライアントが ChatManager を介して新しいチャットを受信できなくなります。

これはまだ asmack のバグですか? カスタム iqprovider を追加する最良の方法は何ですか? これを解決する方法を教えてください。ありがとう!

4

1 に答える 1

1

docs のこの文を見ましたか? IQ サブドキュメントを解析し、IQ インスタンスを作成します。各 IQ には、1 つの子要素が必要です。メソッド呼び出しの開始時に、xml パーサーは IQ 子要素の開始タグに配置されます。メソッド呼び出しの最後に、パーサーを子要素の終了タグに配置する必要があります。」

たぶん、組み込みプロバイダー MUCAdminProvider のようにコードを書く必要があります。

boolean done = false;
while (!done) {
        int eventType = parser.next();
        if (eventType == XmlPullParser.START_TAG) {
            if (parser.getName().equals("actor")) {
                item.setActor(parser.getAttributeValue("", "jid"));
            }
            if (parser.getName().equals("reason")) {
                item.setReason(parser.nextText());
            }
        }
        else if (eventType == XmlPullParser.END_TAG) {
            if (parser.getName().equals("item")) {
                done = true;
            }
        }
    }
于 2013-12-03T06:52:31.413 に答える