2015-12-19 34 views
2

我是新手機android和xmpp ..我正嘗試使用xmpp構建聊天應用程序。我想知道如何設置我的存在,並讓其他用戶出現在xmpp android中。我試着用他們提供的文檔,但它不工作..總是狀態顯示爲空,並鍵入爲不可用。請發佈詳細的答案。如何在xmpp中設置和獲取狀態android

Roster roster = Roster.getInstanceFor(connection);  
//Get all rosters 
if (!roster.isLoaded()) 
    try { 
      roster.reloadAndWait(); 
     } catch (SmackException.NotLoggedInException |  SmackException.NotConnectedException | InterruptedException e) { 
      e.printStackTrace(); 
     } 
    Collection<RosterEntry> entries = roster.getEntries(); 
//loop through 
    for (RosterEntry entry : entries) { 
//example: get presence, type, mode, status 
     Presence entryPresence = roster.getPresence(entry.getUser()); 
     StatusMode statusMode= StatusMode.createStatusMode(entryPresence); 
//   statusMode.getMode(); 
     Presence.Type userType = entryPresence.getType(); 
     Presence.Mode mode = entryPresence.getMode(); 
     String status = entryPresence.getStatus(); 
     retrieveState_mode(mode,entryPresence.isAvailable()); 
     Log.d("####User status","...."+entry.getUser()+"....."+statusMode+"....."+entryPresence +" \ntype: "+"\n"+userType + "\nmode: " +mode + "\nstatus: " + status);// + "\nType: " + status.getType()); 
    } 
    roster.addRosterListener(new RosterListener() { 
     // Ignored events public void entriesAdded(Collection<String> addresses) {} 
     public void entriesDeleted(Collection<String> addresses) { 
     } 

     @Override 
     public void entriesAdded(Collection<String> addresses) { 
     } 

     public void entriesUpdated(Collection<String> addresses) { 
     } 

     public void presenceChanged(Presence presence) { 
      System.out.println("Presence changed: " + presence.getFrom() + " " + presence); 
     } 
    }); 
+1

請加你已經嘗試過的一些代碼 - 它更容易幫助你呀 – Cory

+0

@Cory添加了代碼.. – Arjun090

回答

1

文檔這裏指約Xmpphere for details

這裏找到用戶狀態

Presence availability = roster.getPresence(user); 
Mode userMode = availability.getMode(); 

retrieveState_mode(availability.getMode(),availability.isAvailable()); 

public static int retrieveState_mode(Mode userMode, boolean isOnline) { 
    int userState = 0; 
    /** 0 for offline, 1 for online, 2 for away,3 for busy*/ 
    if(userMode == Mode.dnd) { 
     userState = 3; 
    } else if (userMode == Mode.away || userMode == Mode.xa) { 
     userState = 2; 
    } else if (isOnline) { 
     userState = 1; 
    } 
    return userState; 
} 
+0

嗨感謝您的回覆@sasikumar ...我試過這個,但我geting的「isOnline」一如既往虛假 – Arjun090

0

首先的代碼,請執行下列步驟:

  1. 安裝插件:presence
  2. 前往Server settings > Presence service > Presence visibility
    然後點擊Anyone,因爲任何人都可能得到狀態信息。

然後,執行以下代碼:

public void setUserPresence(int code) { 
    try { 

     /** 5 for offline, 0,1 for online, 3 for away,2 for busy*/ 
     if (Config.conn1 == null) 
      return; 
     Presence presence; 

     if (Config.conn1 != null) { 
      Roster roster = Roster.getInstanceFor(Config.conn1); 
      roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual); 

     roster.createEntry(sharedPreferenceManager.getUsername() + "@" + Config.openfire_host_server_SERVICE, sharedPreferenceManager.getUsername(), null); 
     } 
     switch (code) { 
      case 0: 


      /* Presence pres = new Presence(Presence.Type.subscribe); 
       pres.setFrom("[email protected]"); 
       Config.conn1.sendStanza(pres);*/ 

      Config.conn1.sendPacket(new Presence(Presence.Type.available)); 

       presence = new Presence(Presence.Type.available); 
       presence.setStatus(Constants.ONLINE); 
       presence.setPriority(24); 
       presence.setMode(Presence.Mode.available); 
       //roster = Roster.getInstanceFor(Config.conn1); 
       Config.conn1.sendStanza(presence); 

       Log.e("state", "Set online"); 

       break; 
      case 1: 
       presence = new Presence(Presence.Type.available); 
       presence.setMode(Presence.Mode.chat); 
       Config.conn1.sendStanza(presence); 
       Log.e("state", "Set Q to me"); 
       System.out.println(presence.toXML()); 
       break; 
      case 2: 
       presence = new Presence(Presence.Type.available); 
       presence.setMode(Presence.Mode.dnd); 
       Config.conn1.sendStanza(presence); 
       Log.e("state", "Set the busy"); 
       System.out.println(presence.toXML()); 
       break; 
      case 3: 
       presence = new Presence(Presence.Type.available); 
       presence.setMode(Presence.Mode.away); 
       Config.conn1.sendStanza(presence); 
       Log.e("state", "Set off"); 
       System.out.println(presence.toXML()); 
       break; 
      case 4: 
       Roster roster1 = Roster.getInstanceFor(Config.conn1); 
       Collection<RosterEntry> entries = roster1.getEntries(); 
       for (RosterEntry entry : entries) { 
        presence = new Presence(Presence.Type.unavailable); 
        // presence.setPacketID(Packet.ID_NOT_AVAILABLE); 
        presence.setFrom(Config.conn1.getUser()); 
        presence.setTo(entry.getUser()); 
        Config.conn1.sendStanza(presence); 
        System.out.println(presence.toXML()); 
       } 
       // To the other client sends the same user stealth 
       presence = new Presence(Presence.Type.unavailable); 
       // presence.setPacketID(Packet.ID_NOT_AVAILABLE); 
       presence.setFrom(Config.conn1.getUser()); 
       //presence.setTo(StringUtils.parseBareAddress(Config.conn1.getUser())); 
       Config.conn1.sendPacket(presence); 
       Log.e("state", "Set up stealth"); 
       break; 
      case 5: 
       presence = new Presence(Presence.Type.unavailable); 
       presence.setStatus(Constants.OFFLINE); 
       presence.setPriority(24); 
       presence.setMode(Presence.Mode.away); 
       Config.conn1.sendStanza(presence); 
       Log.e("state", "Set offline"); 
       break; 
      default: 
       break; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.e(TAG, "presence=" + e.toString()); 
    } 
} 

使用得到用戶的存在名冊

Roster roster = Roster.getInstanceFor(conn1); 
Presence presence; presence = roster.getPresence(users.get(i).getUser()); 
Log.e("Tag","presence.getStatus()>"+presence.getStatus()); 
+1

//獲得用戶存在使用名冊 名冊名單= Roster.getInstanceFor(conn1); 存在存在; presence = roster.getPresence(users.get(i).getUser()); (「Tag」,「presence.getStatus()>」+ presence.getStatus()); – Adil