2012-04-28 3 views
4

오픈 파이어 서버와 안드로이드 클라이언트 (마약)가 있습니다. 모든 클라이언트는 서로를 버디/명단 목록에 추가 할 수 있습니다 (승인없이 버디 요청을 수락하지 않고도 서로를 볼 수 있음). 친구 요청 발신자의 현재 상태 정보를 가져 오는 데 몇 가지 문제가 있습니다.Android 마약에서 친구 요청을 올바르게 수락하는 방법은 무엇입니까?

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

나는 사용자 A의 명단 목록에서 사용자 B를 볼 수 있습니다 : 사용자 A, 사용자 B

I에 의해 사용자 A의 명단에 사용자 B를 추가 할 수 있습니다 -
2 사용자가 가정합니다. 모든 것은 지금까지 괜찮
나는 아래의 코드에서 문제가 무엇 상태 사용자 B에 몇 가지 문제가 있습니다

: 나는 사용자 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"); 

} 

이 음주?
또는 이와 같은 친구 요청으로 무엇인가를해야합니까?

@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

좋아, 나는 이틀 동안 열심히 toiled하고 마침내 일하는 것을 얻었다. 수동 가입 모드 (예 : 사용자가 다른 사용자의 요청을 수동으로 수락해야 함)로 구현했습니다. 보내거나받은 수신 상태에 따라 서버가 자동으로 처리 할 때 항목을 직접 작성할 필요가 없습니다.

사례 (자동 가입)의 경우 요청을 로컬에 저장하는 대신 즉시 가입 및 가입 상태를 보내면됩니다.

이 작동하는 방법입니다

  • 사용자 1은 사용자 2에 존재를 구독 보냅니다.
  • 명단 입력은 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 
          } 
         } 
    
관련 문제