如何让用户在线或离线在asmack,android

可能重复:
XMPP aSmack – 如何获取当前用户状态(离线/在线/离开/等)?

我正在开发基于asmack lib的Android上的聊天应用程序。 我在ListView上显示所有的用户,但我使用一个图像来显示在线/离线用户。 但它只能返回离线图像,即使用户在线,这里是我的代码

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.buddies); Controller.getInstance().roster = Controller.getInstance().connection.getRoster(); // ArrayList<Buddy> buddies = new ArrayList<Buddy>(); Collection<RosterEntry> entries = Controller.getInstance().roster.getEntries(); Controller.getInstance().buddyList = new Buddy[entries.size()]; int i = 0; for (RosterEntry r : entries) { Buddy bud = new Buddy(); VCard card = new VCard(); try { ProviderManager.getInstance().addIQProvider("vCard", "vcard-temp", new VCardProvider()); card.load(Controller.getInstance().connection, r.getUser()); } catch (XMPPException e) { Log.e("ChatOnAndroid", e.getMessage() + " " + r.getUser() + " " + e.getLocalizedMessage()); } bud.jid = r.getUser(); bud.name = r.getName(); bud.status = Controller.getInstance().roster.getPresence(r.getUser()); Controller.getInstance().buddies.add(bud); Controller.getInstance().buddyList[i++] = bud; } BuddyAdapter adapter = new BuddyAdapter(this, R.layout.buddy, Controller.getInstance().buddies); setListAdapter(adapter); /* * list = (ListView) findViewById(R.id.buddiesList); * list.setAdapter(adapter); */ } @Override protected void onListItemClick(ListView l, View v, int position, long id) { startActivity(new Intent(this, Conferences.class)); } public class BuddyAdapter extends ArrayAdapter<Buddy> { private ArrayList<Buddy> items; public BuddyAdapter(Context context, int textViewResourceId, ArrayList<Buddy> items) { super(context, textViewResourceId, items); this.items = items; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.buddy, null); } Buddy buddy = items.get(position); if (buddy != null) { TextView tt = (TextView) v.findViewById(R.id.buddyName); ImageView iv = (ImageView) v.findViewById(R.id.buddyThumb); //buddy.status = Controller.getInstance().roster.getPresence(buddy.jid); if (buddy.status != null) { buddy.img = R.drawable.status_online; iv.setImageResource(buddy.img); } else if (buddy.status == null) { buddy.img = R.drawable.status_offline; iv.setImageResource(buddy.img); } //iv.setImageResource(buddy.img); if (tt != null) { tt.setText(buddy.name); } } return v; } } 

Solutions Collecting From Web of "如何让用户在线或离线在asmack,android"

你可以通过RosterListener获得在线和离线的朋友,就像我在下面做的,然后用新的数据更新列表视图。

 roster.addRosterListener(new RosterListener() { @Override public void presenceChanged(final Presence presence) { System.out.println("Presence changed: " + presence.getFrom() + " " + presence); runOnUiThread(new Runnable() { public void run() { // / To Update listview should clear arraylists first // then inavalidate Listview to redraw then add new data // to Arraylists then notify adapter. JID.clear(); Names.clear(); Status.clear(); Image.clear(); list.invalidateViews(); for (RosterEntry entry : entries) { card = new VCard(); presencek = roster.getPresence(entry.getUser()); try { card.load(Main.conn, entry.getUser()); } catch (Exception e) { e.printStackTrace(); } JID.add(entry.getUser()); Names.add(card.getField("FN")); Status.add(presencek.getType().name()); Log.d("Prescence", "" + presencek.getType().name());// //num // one // log // if (bud.name == null) // bud.name = bud.jid; // buddies.add(bud); byte[] img = card.getAvatar(); if (img != null) { int len = img.length; Image.add(BitmapFactory.decodeByteArray(img, 0, len)); } else { Drawable d = getApplicationContext() .getResources().getDrawable( R.drawable.save); Bitmap bitmap = ((BitmapDrawable) d) .getBitmap(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); img = stream.toByteArray(); int len = img.length; Image.add(BitmapFactory.decodeByteArray(img, 0, len)); // Image.add(null); } // buddyList[i++] = bud; } adapter.notifyDataSetChanged(); } @Override public void entriesUpdated(Collection<String> addresses) { // TODO Auto-generated method stub } @Override public void entriesDeleted(Collection<String> addresses) { // TODO Auto-generated method stub } @Override public void entriesAdded(Collection<String> addresses) { // TODO Auto-generated method stub } }); 

有一种方法可以find用户的离线/在线状态。 这可以通过寻求用户的存在来完成。 这里是代码片段:

//这里是你如何获得在线或脱机

  Presence availability = roster.getPresence(user); 

这里是获取其存在模式的代码,即如果用户可用,那么他是离开,不要干扰模式或在线对于CHAT。

 public 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; } 

你可以将这个状态保存在数组列表中:

 mFriendsDataClass.friendState = retrieveState_mode(availability.getMode(),availability.isAvailable()); 

如果您对聊天类应用程序中的xmpp / smack有任何疑问,请让我知道