2012-01-09 1 views
9

Можно создать дубликат:
XMPP aSmack - How can I get the current user state (offline/online/away/etc.)?как получить пользователь онлайн или оффлайн в asmack, андроид

Я разрабатываю чат приложение на Android базы на asmack Lib. Я показываю всех пользователей в 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; 
    } 
} 

ответ

0

Вы можете получить онлайн и оффлайн друзья через RosterListener как я сделал ниже, а затем обновить ListView с новыми данными.

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 

      } 
     }); 
+0

я также сталкиваюсь та же проблема, я могу получить все buddyList из списка сейчас моя задача: как я могу получить только онлайн-пользователей и показать в listview, пожалуйста, назовите меня –

0

Существует средство для поиска автономного/онлайн-статуса пользователя. Это можно сделать, ища ИСПОЛЬЗОВАНИЕ ПОЛЬЗОВАТЕЛЯ. Вот фрагмент кода:

// вот как вы можете получить онлайн или оффлайн

 Presence availability = roster.getPresence(user); 

А вот код, чтобы получить его режим присутствия, т.е. если пользователь доступен, то он AWAY, DONOT РЕЖИМ DISTURB или ONLINE Для 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/привкуса в приложении типа чата

+0

Я пробовал ваш фрагмент, но я получаю пользователя недоступным, даже если другое конечное устройство получает меня в сети –

+0

Пожалуйста, отправьте свой фрагмент кода кода. Вышеприведенный код работает идеально для меня, я не могу сказать или предложить что-либо, не просматривая ваш код в руке. –

+0

личное присутствие присутствия (определено по всему миру) presence = roster.getPresence (emailId. получить (я)); \t \t \t Режим userMode = presence.getMode(); \t \t \t INT userInstance = retrieveStateMode (UserMode, \t \t \t presence.isAvailable()); –