2012-01-09 21 views
9

thể trùng lặp:
XMPP aSmack - How can I get the current user state (offline/online/away/etc.)?làm thế nào để sử dụng trực tuyến hoặc offline trong asmack, android

Tôi đang phát triển ứng dụng trò chuyện trên Android dựa trên asmack lib. Tôi hiển thị tất cả người dùng trên ListView nhưng tôi sử dụng một hình ảnh để hiển thị người dùng trực tuyến/ngoại tuyến. Nhưng Nó chỉ trở lại hình ảnh ẩn, ngay cả những người dùng đang trực tuyến, đây là mã của tôi

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

Trả lời

0

Bạn có thể nhận được trực tuyến và offline bạn bè qua RosterListener như tôi đã làm dưới đây và sau đó cập nhật listview với dữ liệu mới.

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

i am cũng phải đối mặt với cùng một vấn đề, tôi có thể nhận được tất cả buddyList từ danh sách bây giờ nhiệm vụ của tôi là làm thế nào tôi có thể nhận được chỉ người dùng trực tuyến và hiển thị trong listview bạn sẽ hướng dẫn tôi –

0

Có phương tiện để tìm trạng thái ngoại tuyến/trực tuyến của người dùng. Nó có thể được thực hiện bằng cách tìm kiếm sự hiện diện của người sử dụng. Dưới đây là đoạn mã:

// ở đây là làm thế nào bạn có thể nhận được trực tuyến hoặc offline

 Presence availability = roster.getPresence(user); 

Và đây là đoạn code để có được chế độ hiện diện của nó tức là nếu người dùng có sẵn sau đó là ông AWAY, donot DISTURB MODE hoặc ONLINE Dành cho 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; 
    } 

bạn có thể lưu trạng thái này trong một danh sách mảng như: -

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

Xin vui lòng cho tôi biết nếu bạn có bất cứ thắc mắc liên quan đến XMPP/smack ở ứng dụng kiểu trò chuyện

+0

Tôi đã thử đoạn mã của bạn nhưng tôi nhận được người dùng không có sẵn mặc dù các thiết bị đầu cuối khác đang giúp tôi trực tuyến –

+0

Xin vui lòng gửi đoạn mã mẫu của bạn, Mã trên là làm việc hoàn hảo cho tôi, tôi không thể nói hoặc đề nghị bất cứ điều gì mà không xem mã của bạn trong tay –

+0

Sự hiện diện riêng tư; (được xác định trên toàn cầu) presence = roster.getPresence (emailId. lấy tôi)); \t \t \t Chế độ userMode = presence.getMode(); \t \t \t int userInstance = retrieveStateMode (userMode, \t \t \t presence.isAvailable()); –

Các vấn đề liên quan