Android 状态返回始终可用

Android 状态返回始终可用,android,openfire,smack,Android,Openfire,Smack,我可以从openfire获取所有注册用户,但无法获取所有用户的状态。我尝试了下面的代码,但无论该用户在线还是离线,它都会返回可用的代码。请帮助我获取所有用户的状态。任何建议都可以接受 try { String username = etUsername.getText().toString(); String password = etPassword.getText().toString(); myXMPP

我可以从openfire获取所有注册用户,但无法获取所有用户的状态。我尝试了下面的代码,但无论该用户在线还是离线,它都会返回可用的代码。请帮助我获取所有用户的状态。任何建议都可以接受

try
        {
            String username = etUsername.getText().toString();
            String password = etPassword.getText().toString();
            myXMPP.getConnection().login(username, password);

            UserSearchManager usm = new UserSearchManager(myXMPP.getConnection());

            Form searchForm = usm.getSearchForm("search." + myXMPP.getConnection().getServiceName());
            Form answerForm = searchForm.createAnswerForm();
            UserSearch userSearch = new UserSearch();
            answerForm.setAnswer("Username", true);
            answerForm.setAnswer("search", "*");
            ReportedData data = userSearch.sendSearchForm(myXMPP.getConnection(), answerForm, "search." + myXMPP.getConnection().getServiceName());

            if (data.getRows() != null)
            {
                UserInfoDtl contactDetail = new UserInfoDtl(context);

                for(int i=0;i<data.getRows().size();i++)
                {

                    ContentValues values = new ContentValues();
                    String Name = data.getRows().get(i).getValues("Name").toString().replace("[", "").replace("]", "");
                    String Jid = data.getRows().get(i).getValues("jid").toString().replace("[", "").replace("]", "");
                    String Email = data.getRows().get(i).getValues("Email").toString().replace("[", "").replace("]", "");
                    String Status = "";
                    values.put(contactDetail.NAME,Name);
                    values.put(contactDetail.JID,Jid);
                    values.put(contactDetail.STATUS,Status);
                    values.put(contactDetail.EMAIL,Email);
                    //  contactDetail.deleteTable();
                    if(!contactDetail.isUserExist(Jid))
                        contactDetail.insert(values);
                    Roster roster = Roster.getInstanceFor(myXMPP.getConnection());
                    /*Presence availability = roster.getPresence(Jid);
                    myXMPP.getConnection().sendStanza(availability);
                    Presence.Mode userMode = availability.getMode();
                    int flag = retrieveState_mode(availability.getMode(),availability.isAvailable());
                    Log.e(Jid,availability.isAvailable()+"");*/
                    try
                    {
                        Presence availability = roster.getPresence(Jid);
                        myXMPP.getConnection().sendStanza(availability);
                        Presence.Mode userMode = availability.getMode();
                        int flag = retrieveState_mode(availability.getMode(),availability.isAvailable());
                        Log.e(Jid,availability.getType()+"");
                    } catch (Exception e) {
                        android.util.Log.e("tag", "unable to add contact: ", e);
                    }

                }

                /*Roster roster = Roster.getInstanceFor(myXMPP.getConnection());
                Presence availability = roster.getPresence(myXMPP.getConnection().getUser());
                Log.e("Status" , availability.getType()+"");*/


                /*Collection<RosterEntry> entries = roster.getEntries();
                for (RosterEntry entry : entries) {
                    Presence presence = roster.getPresence(entry.getUser());
                    Log.e("Entry",entry+"");
                    Log.e("IsAvailable ",""+presence.isAvailable());
                    Log.e("Status" , ""+presence.getStatus());
                }*/




            }
            return true;

        }
        catch (XMPPException | SmackException | IOException e)
        {
            if(e.getMessage().contains("Already Logged in"))
            {
                Log.e("Messaging Service","Already Logged in "+ myXMPP.getConnection().getUser());
                return true;
            }
            else
            {
                ERRORMSG = e.getMessage();
                return false;
            }
        }

//-------------------------------------------------------------
public static int retrieveState_mode(Presence.Mode userMode, boolean isOnline)
    {
        int userState = 0;
        /** 0 for offline, 1 for online, 2 for away,3 for busy*/
        if(userMode == Presence.Mode.dnd) {
            userState = 3;
        } else if (userMode == Presence.Mode.away || userMode == Presence.Mode.xa) {
            userState = 2;
        } else if (isOnline) {enter code here
            userState = 1;
        }
        return userState;
    }
试试看
{
字符串username=etUsername.getText().toString();
字符串password=etPassword.getText().toString();
myXMPP.getConnection().login(用户名、密码);
UserSearchManager usm=newUserSearchManager(myXMPP.getConnection());
Form searchForm=usm.getSearchForm(“search.”+myXMPP.getConnection().getServiceName());
Form answerForm=searchForm.createAnswerForm();
UserSearch UserSearch=newusersearch();
answerForm.setAnswer(“用户名”,true);
setAnswerForm.setAnswer(“搜索”,“*”);
ReportedData data=userSearch.sendSearchForm(myXMPP.getConnection(),answerForm,“search.”+myXMPP.getConnection().getServiceName());
if(data.getRows()!=null)
{
UserInfoDtl contactDetail=新的UserInfoDtl(上下文);

对于(int i=0;我使用RosterListener得到了一半答案,而另一个用户登录时,我将获得该用户是否在线。但我无法在我的应用程序中获得登录时的所有在线用户。“所有在线用户”不是一个核心的XMPP规范。对于XMPP,您可以强制所有用户都在彼此的名册中,并像您那样使用状态,或者仅使用Openfire(它不是一个标准规范),您可以创建一个Openfire组,将所有用户放在一个公共组中,并再次显示此组的用户状态。因此,根据您的顾虑,我应该首先创建一个组,然后将所有用户添加到该组。使用MultiUserChat创建此组,对吗?@MrPkNo,组不是groupchat。您可以在花名册中创建一个组(如Skype中的“朋友”)虽然花名册的目的是要有一个联系人列表(这是一个核心的Xmpp规范)。通过这种方法,您的努力是同步任何用户花名册与当前用户(例如,针对Jabber搜索寻找*)。另一种方法是创建Openfire的组(例如:AllUserGroup)和订阅此组。这是OF的功能,您的效果将是向每个现有用户和新注册的用户订阅此组。对不起,我没有任何工作示例可显示。