天天看点

基于XMPP协议的Android IM研究二

<a></a>

好友的监听我把它分成两部分,一部分是监听好友的上线、下线等通知,另一部分是监听好友发起“添加您为好友”的通知。第一部分比较简单,直接上代码:

Java代码  

@Override        

    public void entriesAdded(Collection&lt;String&gt; address) {        

        for(String jid : address) {        

            RosterEntry entry = XMMPManager.connection.getRoster().getEntry(jid);        

            User user = new User();        

            user.setUser(jid);        

            user.setName(entry.getName());        

            user.setStatus(XMMPManager.connection.getRoster().getPresence(jid));        

            groups.get(0).getUsers().add(user);        

            AppContext.setGroups(groups);        

        }        

        handler.sendEmptyMessage(HandlerMessage.ENTRIESADDED);        

    }        

    @Override        

    public void entriesDeleted(Collection&lt;String&gt; address) {        

        for (String jid : address) {        

            removeContact(entry);        

            removeContact(getContactByJid(jid), getGroupByUser(jid));        

        handler.sendEmptyMessage(HandlerMessage.ENTRIESDELETED);        

    public void entriesUpdated(Collection&lt;String&gt; address) {        

        // TODO Auto-generated method stub        

    public void presenceChanged(Presence presence) {        

        Bundle bundle = new Bundle();        

        Log.i(ContactManager.class.getCanonicalName(), presence.getStatus());        

        if (presence.isAway()) {        

            bundle.putString("status", PresenceManager.STATUSAWAY);        

        } else if (presence.isAvailable()) {        

            bundle.putString("status", PresenceManager.STATUSAVAILABLE);        

        bundle.putString("user", presence.getFrom());        

        Intent intent = new Intent();        

        intent.setAction(CustomAction.ROSTER_STATUS_CHANGED_ACTION);        

        intent.putExtras(bundle);        

        activity.sendBroadcast(intent);        

    }    

具体就不解释了,看方法名就知道什么意思了。presenceChanged就是好友状态的改变。entriesAdded和entriesDeleted就是对应添加和删除好友。无非就是监听这些方法,然后界面发送事件给界面处理,比如下线了,用户头像变灰,用户列表总数对应减少等等。

好友监听的另一部分就是,当好友向你发起“添加您为好友”的通知时,你需要做出拒绝或者接受的选择,然后再通知给用户,用户那边做出选择后再返回给你,这样就完成了添加或拒绝好友的一个过程。这就是具体的思路,我的理解是这样的。下面请看我的代码:

public void addSubscriptionListener() {        

         PacketFilter packetFilter = new PacketTypeFilter(Presence.class);        

         PacketListener subscribeListener = new PacketListener(){        

            @Override        

            public void processPacket(Packet packet) {        

                final Presence presence = (Presence)packet;        

                if (presence.getType().equals(Presence.Type.subscribe)) {        

                    Message msg = new Message();        

                    msg.what = HandlerMessage.SUBSCRIBE;        

                    String from = presence.getFrom();        

                    Bundle data = new Bundle();        

                    data.putString("from", from);        

                    Log.i(ContactManager.class.getCanonicalName(), "from:"+from);        

                    msg.setData(data);        

                    handler.sendMessage(msg);        

                } else if (presence.getType().equals(Presence.Type.unsubscribe)) {        

                    msg.what = HandlerMessage.UNSUBSCRIBE;        

                }        

                Log.i(ContactManager.class.getCanonicalName(), "type:" + presence.getType());        

            }        

         };        

         XMMPManager.connection.addPacketListener(subscribeListener, packetFilter);        

这个方法在XMPP连接后便可调用,表示一开始就监听好友。

关于聊天信息的监听主要使用下面的方法:

public class MessageListenerEx implements MessageListener {        

        @Override        

        public void processMessage(Chat chat, Message message) {        

            Log.i(ChatActivity.class.getCanonicalName(), message.getBody());        

            ChatInfo chatinfo = new ChatInfo();        

            chatinfo.setText(message.getBody());        

            chatinfo.setUserName(StringUtil.getLeftString(message.getFrom(), "@"));        

            chatinfo.setDate(DateUtil.getCreateAt(new Date()));        

            chatinfo.setLayoutId(R.layout.list_say_me_item);        

            chatinfos.add(chatinfo);        

            handler.sendEmptyMessage(RECEIVE);        

这个方法就是不断地接收用户发过来的消息,当然还需要处理很多细节,这里不列出来了。

获取聊天对象和聊天管理类并添加监听接口:

ChatManager chatManager = XMMPManager.connection.getChatManager();        

Chat chat = chatManager.createChat(user, null);        

chatManager.addChatListener(new ChatManagerListenerEx());    

user是聊天的对象。下面是监听的实现方法。

public class ChatManagerListenerEx implements ChatManagerListener {        

        public void chatCreated(Chat chat, boolean arg1) {        

            chat.addMessageListener(ml);        

大概就是这样,发送一条信息:

chat.sendMessage(content);    

     本文转自06peng 51CTO博客,原文链接:http://blog.51cto.com/06peng/963459,如需转载请自行联系原作者

继续阅读