2

Java 用の Smack メッセージング ライブラリで適切なチャットを確立できません。チャットがローカルで開始された場合は問題なく動作しますが、チャットが別のクライアントから開始された場合は、必要な 1 つのスレッドだけではなく、2 つの異なるチャット スレッドが作成されます。メッセージを送信するための私のコードは次のとおりです。

public void sendMessage(String input) throws XMPPException 
    {
        Chat chat = connection.getChatManager().getThreadChat("test@server");
        if(chat != null)
        {
            System.out.println("Chat exists!");
            chat.addMessageListener(messageListener);
        }
        else
        {
            System.out.println("Create new chat");
            chat = connection.getChatManager().createChat("test@server", "test@server", messageListener);
        System.out.println(chat.getThreadID());
        }
        chat.sendMessage(input);
    }

以下に、着信メッセージを処理するリスナー クラスを示します。ログイン直後にメッセージを受信し、チャットを確立できるように、プログラムが初期化されたときに最初に設定されます。上記の関数のmessageListener変数によっても呼び出されます。sendMessage

class MyMessageListener implements MessageListener {
        @Override
        public void processMessage(Chat chat, Message message) {
            String from = message.getFrom();
            String body = message.getBody();
            System.out.println(chat.getThreadID());
            System.out.println(String.format("Received message '%1$s' from %2$s", body, from));    
        }
    }

私は Smack ライブラリに非常に慣れていないため、利用可能なドキュメントと例が少し曖昧です。チャットが別のクライアントで作成されたかどうかを確認し、このチャットのスレッド ID を何らかの方法で取得する方法、またはメッセージを送信したユーザーの名前を知ることで ChatManager からチャット オブジェクトを見つける方法について、だれかが教えてくれますか?

4

1 に答える 1

2

ドキュメントの「着信チャット」セクションで説明されているように、着信チャットをリッスンするには、 ChatManagerListenerを登録する必要があります。この方法で作成されたチャットのリスナーは、同じスレッドIDで応答していると想定して着信メッセージを受信します(すべてのクライアントがスレッドIDを使用するわけではありません)。

ちなみに、あなたは既存のチャットをスレッドで検索していますが、それは着信チャットのスレッドIDではありません。表示したコードスニペットは、自分で作成したチャットでのみ一致するため、メッセージを送信するたびにメッセージリスナーを設定しても意味がありません。メッセージを送信するたびに、メッセージリスナーへの参照を保持することもできます。作成です。

これを正しく機能させるには、着信チャットからスレッドIDを取得する必要があります。これは、着信チャットが実際にチャットIDを持っていることを前提としています。

于 2013-03-18T13:58:47.527 に答える