Android 状态返回始终可用
我可以从openfire获取所有注册用户,但无法获取所有用户的状态。我尝试了下面的代码,但无论该用户在线还是离线,它都会返回可用的代码。请帮助我获取所有用户的状态。任何建议都可以接受Android 状态返回始终可用,android,openfire,smack,Android,Openfire,Smack,我可以从openfire获取所有注册用户,但无法获取所有用户的状态。我尝试了下面的代码,但无论该用户在线还是离线,它都会返回可用的代码。请帮助我获取所有用户的状态。任何建议都可以接受 try { String username = etUsername.getText().toString(); String password = etPassword.getText().toString(); myXMPP
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的功能,您的效果将是向每个现有用户和新注册的用户订阅此组。对不起,我没有任何工作示例可显示。