2012-01-09 10 views
9

Eventuali duplicati:
XMPP aSmack - How can I get the current user state (offline/online/away/etc.)?come ottenere utente in linea o non in linea in asmack, Android

sto sviluppando un'applicazione chat a base di Android su asmack lib. Visualizzo tutti gli utenti su ListView ma utilizzo un'immagine per mostrare utenti online/offline. Ma E 'ritorno di immagine non in linea solo, anche l'utente è online, qui è il mio codice

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

risposta

0

È possibile ottenere on-line e gli amici offline tramite RosterListener come ho fatto qui sotto e poi aggiorno ListView con i nuovi dati.

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

sto affrontando anche lo stesso problema, sono in grado di ottenere tutti i buddyList dal roster ora il mio compito è come potrei ottenere solo gli utenti online e mostrare in listview per favore mi guidi –

0

C'è un modo per trovare lo stato offline/online dell'utente. Può essere fatto cercando la PRESENZA DELL'UTENTE. Ecco il frammento di codice:

// Ecco come si può ottenere è online o offline

 Presence availability = roster.getPresence(user); 

E qui è il codice per ottenere la sua modalità di presenza cioè se l'utente è disponibile, allora è lui LONTANO, DONOT MODALITÀ DISTURBO o ONLINE per 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; 
    } 

è possibile salvare questo stato in una lista di array come: -

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

Per favore fatemi sapere se avete qualsiasi domanda riguardante XMPP/nel bel tipo di applicazione di chat

+0

Ho provato il tuo snippet ma sto ottenendo l'utente non disponibile anche se l'altro dispositivo terminale Mi sta prendendo in giro –

+0

Inserisci il tuo frammento di codice di esempio, Il codice sopra riportato funziona perfettamente per me, non posso dire o suggerire nulla senza visualizzare il tuo codice in mano –

+0

presenza presenza privata; (definito Globalmente) presence = roster.getPresence (emailId. ottenere (i)); \t \t \t Mode userMode = presence.getMode(); \t \t \t int = userInstance retrieveStateMode (usermode, \t \t \t presence.isAvailable()); –