使所有Gtalk联系人的状态不可用

时间:2012-02-28 12:01:18

标签: android google-talk asmack

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

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。 任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

你在什么时候试图获得名单?你有没有尝试过presence2.isAvailable()?我还建议设置一个名册监听器,否则,当任何用户的状态发生变化时,您的列表将不会更新。

答案 1 :(得分: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();
                }});
        }});
    }