2012-04-28 12 views
4

OpenfireサーバーとAndroidクライアント(スマック)があります。すべてのクライアントはお互いをバディ/リストに追加することができます(承認なしで、ユーザーはバディリクエストを受け入れずにお互いを見たいと思っています)。バディリクエスト送信者のプレゼンス情報を取得する際にいくつか問題があります。私は、ユーザーAの名簿リストにユーザBを見ることができますAndroidスマートフォンでバディリクエストを正しく受け入れる方法は?

Roster roster = xmppManager.connection.getRoster(); 
roster.setSubscriptionMode(Roster.SubscriptionMode.accept_all); 
roster.createEntry("userB", "[email protected]", null); 

:ユーザA、ユーザB

私がしてユーザーAの名簿にユーザBを追加することができます -
は2人のユーザーがいるとします。ユーザーAで)私はcreateEntry(に

//I have set the available and status of User A by: 
//xmppManager.setStatus(available, bundle.getString("new_status")); 
... 

// That's how I get Roster and Presence of user A 
Roster roster = connection.getRoster(); 

Collection<RosterEntry> entries = roster.getEntries(); 
for (RosterEntry entry : entries) { 


    Presence presence = roster.getPresence(entry.getUser()); 

    // User A always not available even I set User A to available 
    Log.e(TAG, "presence.isAvailable() = " + presence.isAvailable()); 

    // User A's status always empty 
    Log.e(TAG, "presence.getStatus() = " + presence.getStatus()); 


    // User A's getName() always null 
    if (entry.getName() != null) 
    { 
     name = entry.getName(); 
    } 
    else 
     Log.e(TAG, "GetName is null"); 

} 

必要です:すべては、これまで

私は以下のコードで、問題をされているもの状態ユーザBとのいくつかの問題がありますが大丈夫ですか?
またはこのようなバディリクエストで何かする必要がありますか?

@Override 
    public void entriesAdded(Collection<String> collection) { 
     String user = ""; 
     Iterator<String> it = collection.iterator(); 
     if(it.hasNext()){ 
      user=it.next(); 
     } 


     Presence presence = new Presence(Presence.Type.subscribe); 
     presence.setTo(user); 
     connection.sendPacket(presence); 

    } 

しかし、動作しません。私は最初にユーザーBに何かする必要があるようです。どんな考えも歓迎です、ありがとう!

答えて

2

さて、私は数日間このことを頑張って、ついには仕事をしました。私は手動購読モードでそれを実装しました(つまり、ユーザーは別のユーザーの要求を手動で受け入れる必要があります)。送受信されたプレゼンスに従ってサーバーが自動的にこれを処理するので、自分でエントリを作成する必要はありません。

あなたの場合(自動定期購読)は、リクエストをローカルに保存するのではなく、ただちに購読して購読したプレゼンスを送信するだけです。

これは、それがどのように動作するかです:

  • User1がUser2のに存在感を購読送信します。
  • ルースターエントリは、User1の名簿に自動的に作成されます(ただし、User2の名簿には含まれません)。
  • User2はUser1からの購読要求を受け取ります。
  • User2は、購読済みのプレゼンスをUser2に返します(User2> User1購読完了)。
  • User2は、User1がUser2の名簿に登録されているかどうかを確認します。 User1はUser2の名簿にいません。 User2はUser1にサブスクライブプレゼンスを返します。
  • ルースターエントリは、User2のロスタに自動的に作成されます。
  • User1はUser2からの購読プレゼンスを受信します。
  • User1は、User2がUser1の名簿に登録されているかどうかを確認します。 User2はUser1の名簿に入っています。 User1は、加入したプレゼンスをUser2に返信します(User2> User1加入完了)。

     final Presence newPresence = (Presence) packet; 
         final Presence.Type presenceType = newPresence.getType(); 
         final String fromId = newPresence.getFrom(); 
         final RosterEntry newEntry = getRoster().getEntry(fromId); 
    
         if (presenceType == Presence.Type.subscribe) 
         { 
          //from new user 
          if (newEntry == null) 
          { 
           //save request locally for later accept/reject 
           //later accept will send back a subscribe & subscribed presence to user with fromId 
           //or accept immediately by sending back subscribe and unsubscribed right now 
          } 
          //from a user that previously accepted your request 
          else 
          { 
           //send back subscribed presence to user with fromId 
          } 
         } 
    
関連する問題