0

XMPP Mongoose サーバーから smack API を使用して Android アプリでオフライン メッセージを取得するという問題に直面しています。コード フローに従って、利用可能なプレゼンスを mongoose サーバーに送信する前に、ユーザーが xmpp mongoose サーバーにログインしたときに、オフライン メッセージの取得を試みます。

オフライン メッセージを取得する 2 つの異なる方法を試してみましたが、同じ解決策を見つけることができませんでした。私がこれらすべてを試した両方の方法は、以下で詳細に説明されています。

以下の Api では、xmpp 接続とその他すべての拡張機能に使用しています。

// スマック (XMPP クライアント ライブラリ) </p>

「org.igniterealtime.smack:smack-android:4.1.6」をコンパイルします


「org.igniterealtime.smack:smack-tcp:4.1.6」をコンパイルします

「org.igniterealtime.smack:smack-im:4.1.6」をコンパイルします</p>

「org.igniterealtime.smack:smack-android-extensions:4.1.6」をコンパイルします

offlineMessageManager を使用してオフライン メッセージを取得しようとしました

以下は、ログイン後、利用可能なプレゼンスをサーバーに送信する前に、オフライン メッセージを取得しようとしたコードです。

{ </p> を試してください

Boolean isFelxibleRetrievalSupport = offlineMessageManager.supportsFlexibleRetrieval(); </p>

イテレータ i = (イテレータ) offlineMessageManager.getMessages(); </p>

while (i.hasNext())

{ メッセージ msg = i.next(); System.out.println("Get text [" + msg.getBody() + "] from [" + msg.getFrom() + "]");


キャッチ (XMPPException e)

{ System.out.println("エラー オフライン メッセージ"); e.printStackTrace(); }

キャッチ (SmackException.NotConnectedException e)

{ System.out.println("エラー オフライン メッセージ。接続なし"); e.printStackTrace(); }

キャッチ (SmackException.NoResponseException e)

{ System.out.println("エラー オフライン メッセージ。応答なし"); e.printStackTrace(); }

問題ケース 1:

以下は、上記のコードが実行されたときに生成される例外の詳細です

以下のコード行を実行すると例外が発生しました。

イテレータ i = (イテレータ) offlineMessageManager.getMessages(); </p>

以下は、上記の行が実行されたときに生成される例外の説明です

org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPPError: service-unavailable - キャンセル

問題ケース 2:

チェックが xmmp mongoose サーバーからの smack を使用して Android コードからサポートされている柔軟なオフライン メッセージである場合、false 値が得られます。以下は、テストに使用したコードです。

Boolean isFelxibleRetrievalSupport = offlineMessageManager.supportsFlexibleRetrieval();

問題ケース 3:

以下のようなスマックコードを使用して、以下のメソッドを使用してサポートされている機能を取得しようとすると。

ServiceDiscoveryManager manager = ServiceDiscoveryManager

.getInstanceFor(接続);

List AllFetures = manager.getFeatures();

以下は、私が取得した機能リストです。

http://jabber.org/protocol/bytestreams

jabber:iq:privacy、urn:xmpp:ping、

http://jabber.org/protocol/commands

jabber:iq:バージョン、

jabber:iq:最後、

http://jabber.org/protocol/xdata-validate

http://jabber.org/protocol/xhtml-im

vcard-temp、

http://jabber.org/protocol/chatstates

壷:xmpp:領収書、壷:xmpp:時間、

http://jabber.org/protocol/xdata-layout

http://jabber.org/protocol/muc

http://jabber.org/protocol/disco#items

http://jabber.org/protocol/disco#info

http://jabber.org/protocol/caps

jabber:x:データ

XMPP MongooseIM からパッケージ リスナーを使用してオフライン メッセージを取得しようとしました

以下は、smack api 4.1.6 のパッケージ リスナーを使用して試したコードです。

private static final StanzaFilter MESSAGE_PACKET_FILTER= new OrFilter(StanzaTypeFilter.MESSAGE);

構成 = XMPPTCPConnectionConfiguration.builder()

            .setServiceName(SERVICE_NAME)

            .setHost(KDevelopmentXMPPServer)

            .setPort(PORT)

            .setSendPresence(false)

            .build();

// 詳細が設定された xmpp 接続の Connection オブジェクトを作成します

接続 = 新しい XMPPTCPConnection(構成);

connection.addAsyncStanzaListener(new StanzaListener() {

            @Override

            public void processPacket(Stanza packet) throws SmackException.NotConnectedException {


                Log.d("CheckPacket", "OfflineMEssage");


                Message message = (Message) packet;

                if (message != null) {

                    if (message.getBody() != null) {



                        Log.i("XMPPClient", "Got text [" + message.getBody()

                                + "] from [" + message.getFrom() + "]");



                    }

                }



            }

        }, MESSAGE_PACKET_FILTER);

connection.login(ユーザー、パスワード);

事前に感謝します。私の重大な問題に対する最善の解決策を誰か助けてください。

4

2 に答える 2

0

私はこれを書いているのが遅すぎることを知っていますが、「アンドロイドアプリでアーカイブメッセージを保存して取得する方法」と同じクエリを探している私のような人がこの回答を参照できる場合:

注: これは最新バージョンで実装されています

要件:

  1. 現在の最新のオープンファイア4.1.4
  2. openfire に Archives プラグインをインストールする
    MamManager mamManager = MamManager.getInstanceFor(connection);
    boolean isSupported = mamManager.isSupportedByServer();
    if (isSupported) {
        MamManager.MamQueryResult mamQueryResult = mamManager.queryArchive(500);
        List<Forwarded> forwardedMessages = mamQueryResult.forwardedMessages;
        Forwarded d = forwardedMessages.get(0);
    }

参照してください: MamManager クラスのドキュメント

于 2017-05-13T11:26:32.290 に答える