0

我正在使用 asmack api 将 gtalk 与我的 android 应用程序集成我可以登录,可以向我的联系人用户发送消息,但我想知道所有联系人的状态,无论他/她是在线还是离线,我使用名册来了解它,但显示所有users'availability is offline 没有人出现在线,实际上,有一些用户在线,想知道发生了什么问题。谁能帮忙?在下面粘贴我的代码:

Roster roster= connection.getRoster();
        roster.setSubscriptionMode(Roster.getDefaultSubscriptionMode());
        Collection<RosterEntry> entries = roster.getEntries();
        Presence presence2;

                for(RosterEntry entry : entries) {
                    presence2 = roster.getPresence(entry.getUser());

                    System.out.println(entry.getUser());
                    System.out.println(presence2.getType());
                   // System.out.println(presence2.getStatus());
                }

也尝试过使用 presence2.getMode() ,但它返回 null。任何帮助将不胜感激

4

2 回答 2

0

您是在什么时候尝试获得名册的?您是否尝试过 present2.isAvailable()?我还建议设置一个名册侦听器,否则,当任何用户的状态发生更改时,您的列表将不会更新。

于 2012-02-29T07:44:24.403 回答
0

这是我为我的 BuddyList 课程所做的。我将我的gridview 传递给一个buddylist 类,并在一个线程中运行此代码以更新附加到适配器的数组。我知道这已经几个月了,但认为它会在某个时候对其他人有所帮助。只需确保从新线程调用 updateBuddies 即可。当您离开托管好友列表的活动时,请务必处理关闭此线程。干杯。

http://i.imgur.com/4o7JLkx.png

    private void updateBuddies() {
    final Roster roster = connection.getRoster();
    roster.addRosterListener(new RosterListener() {

        @Override
        public void entriesAdded(Collection<String> arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void entriesDeleted(Collection<String> arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void entriesUpdated(Collection<String> arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void presenceChanged(Presence arg0) {
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    addressA.clear();
                    nameA.clear();
                    modeA.clear();
                    availA.clear();
                    statusA.clear();
                    grid.invalidateViews();
                    Collection<RosterEntry> entries = roster.getEntries();
                    for(RosterEntry r:entries) {
                        if (r.getName() != null) {
                            String email = r.getUser();
                            String name = r.getName();
                            Presence pres = roster.getPresence(r.getUser());

                            if (pres != null) {
                                addressA.add(email);
                                nameA.add(name);
                                modeA.add(""+pres.getMode());
                                availA.add(""+pres.getType());
                                statusA.add(""+pres.getStatus());   
                            }
                        }
                    }
                    adapter.notifyDataSetChanged();
                }});
        }});
    }
于 2013-04-29T13:34:54.097 回答