2012-01-09 30 views
9

Olası Çoğalt:
XMPP aSmack - How can I get the current user state (offline/online/away/etc.)?, android

Ben asmack lib Android tabanında bir sohbet uygulamasını geliştiriyorum. Tüm kullanıcıları ListView'de görüntülüyorum, ancak çevrimiçi/çevrimdışı kullanıcı göstermek için bir resim kullanıyorum. Ama Hatta kullanıcı çevrimiçi, sadece çevrimdışı görüntüyü döndürmek, işte kod

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

cevap

0

Çevrimiçi almak ve RosterListener aracılığıyla çevrimdışı arkadaşların i aşağıda yaptım ve daha sonra yeni verilerle liste görünümü güncellemek gibi olabilir olduğunu.

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

ilgili herhangi bir sorunuz varsa lütfen bildirin aynı sorun, ben tüm arkadaş listeden şimdi alabilirim benim görevim sadece çevrimiçi kullanıcılar ve liste görünümünde nasıl görünebilirim lütfen bana rehberlik edeceksiniz –

0

Kullanıcının çevrimdışı/çevrimiçi durumunu bulmak için bir yöntem vardır. KULLANICININ TANITIMI aranarak yapılabilir. // burada

nasıl alabiliyorsunuz

 Presence availability = roster.getPresence(user); 

çevrimiçi veya çevrimdışı olduğunu Ve burada kullanıcı varsa onun varlığı modu yani almak için kod sonra, UZAK Bağışta bulunan kimse ise: İşte kod parçacığı İşte DISTURB MODU veya CHAT için ONLINE.

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; 
    } 
gibi bir dizi listesinde bu durumu kurtarabilir

: -

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

Eğer xmpp/şaplak sohbet tipi uygulamada ben de karşı karşıya am

+0

Parçacık denedim ama diğer uç cihazda bile kullanıcı kullanılamıyorum bana çevrimiçi oluyor –

+0

Lütfen örnek kod parçacığınızı gönderin, Yukarıdaki kod benim için mükemmel çalışıyor, kodunuzu görüntülemeden hiçbir şey söyleyemem ya da bir şey öneremiyorum –

+0

özel Varlık varlığı (Globally olarak tanımlandı) presence = roster.getPresence (emailId. elde (i)); \t \t \t Mode userMode = presence.getMode(); \t \t \t int userInstance = retrieveStateMode (usermode, \t \t \t presence.isAvailable()); –