6

この質問が以前にも出されたことは知っていますが、ここでmskonaker から提供された回答は部分的なものにすぎません。私のウェブサイトでは、ユーザーは自分の名簿に人を追加できます。次に、バディが受け入れる必要があり、最終的に接続されます。最初の人 (ユーザー a) は、有名な

roster.createEntry(jid, name, groups);

これは機能し、彼の名簿にエントリを追加しますが、何をすべきか少し混乱しています:

  • 相手側でリクエストを受け取るにはどうすればよいですか? 私は PacketListener を実装し、processPacket() をオーバーライドし、Presence.Type.subscribe または Presence.Type.subscribed であるパケットをチェックしようとしましたが、それはユーザー a に対してのみトリガーされているように見えますが、リッスンする必要があるものではないようですサブスクリプション - ユーザー b.

  • 次に、ログイン時にすべてのリクエストを検索できる別の機能があるため、再度ログインするとリクエストが表示されますが、どうすればそれを受け入れることができますか? 最初は、ユーザー b もユーザー a を自分の名簿に追加する必要があると考えていました。 roster.createEntry(jid, name, groups);

しかし、それはうまくいかず、何も起こっていませんでした。私もやってみました

Presence subscribed = new Presence(Presence.Type.subscribed);
subscribed.setTo(jid);
xMPPConnection.sendPacket(subscribed);

しかし、どちらも機能しませんでした。それを行うための適切で簡単な方法があるに違いないと確信していますが、これまでのところどこにも見つけられず、一度に1つずつ試してみると、頭が痛くなりすぎました。誰かがこれの正しい流れを知っていますか? 前もって感謝します!

4

1 に答える 1

4

Smack のドキュメントから: 名簿とプレゼンスは、他のユーザーの名簿に追加される前にユーザーが許可を与える必要があるアクセス許可ベースのモデルを使用します。これにより、承認されたユーザーのみがプレゼンス情報を表示できるようになり、ユーザーのプライバシーが保護されます。したがって、新しい名簿エントリを追加すると、他のユーザーが要求を受け入れるまで保留状態になります。別のユーザーがあなたを自分の名簿に追加できるようにプレゼンス サブスクリプションを要求した場合は、その要求を受け入れるか拒否する必要があります。Smack は、次の 3 つの方法のいずれかでプレゼンス サブスクリプション リクエストを処理します。

Automatically accept all presence subscription requests.
Automatically reject all presence subscription requests.
Process presence subscription requests manually. 

モードは Roster.setSubscriptionMode(Roster.SubscriptionMode) メソッドを使用して設定できます。単純なクライアントは通常、自動化されたサブスクリプション モードのいずれかを使用しますが、フル機能のクライアントは、サブスクリプション リクエストを手動で処理し、エンド ユーザーが各リクエストを受け入れるか拒否できるようにする必要があります。手動モードを使用する場合、Presence.Type.subscribe のタイプを持つプレゼンス パケットをリッスンする PacketListener を登録する必要があります。

そのため、Roster のサブスクリプション モードを手動に設定してから、PacketListener を実装して Presence.Type.subscribe をリッスンしてみてください。パケットを受信したら、Presence.Type.subscribed で新しいパケットを作成し、送信者に送信します。

于 2011-07-13T14:21:32.417 に答える