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(ユーザー、パスワード);
事前に感謝します。私の重大な問題に対する最善の解決策を誰か助けてください。