2015-12-19 96 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