基于XMPP协议的Android IM研究二
2011-12-05 00:00
405 查看
那么由于有了基于XMPP协议的Android IM研究一,这篇文章就继续介绍XMPP和ASmack的相关用法。在这里主要介绍好友的监听和聊天信息的监听。对了好友的监听我费了比较多的功夫,主要参考了Spack客户端的源代码,高手写的代码就是不一样,很多代码的实现方式都需要我不断学习。Spack客户端源代码的地址:http://svn.ig.../repos/spark/
好友的监听我把它分成两部分,一部分是监听好友的上线、下线等通知,另一部分是监听好友发起“添加您为好友”的通知。第一部分比较简单,直接上代码:
具体就不解释了,看方法名就知道什么意思了。presenceChanged就是好友状态的改变。entriesAdded和entriesDeleted就是对应添加和删除好友。无非就是监听这些方法,然后界面发送事件给界面处理,比如下线了,用户头像变灰,用户列表总数对应减少等等。
好友监听的另一部分就是,当好友向你发起“添加您为好友”的通知时,你需要做出拒绝或者接受的选择,然后再通知给用户,用户那边做出选择后再返回给你,这样就完成了添加或拒绝好友的一个过程。这就是具体的思路,我的理解是这样的。下面请看我的代码:
这个方法在XMPP连接后便可调用,表示一开始就监听好友。
关于聊天信息的监听主要使用下面的方法:
这个方法就是不断地接收用户发过来的消息,当然还需要处理很多细节,这里不列出来了。
获取聊天对象和聊天管理类并添加监听接口:
user是聊天的对象。下面是监听的实现方法。
大概就是这样,发送一条信息:
好友的监听我把它分成两部分,一部分是监听好友的上线、下线等通知,另一部分是监听好友发起“添加您为好友”的通知。第一部分比较简单,直接上代码:
Java代码 @Override public void entriesAdded(Collection<String> 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<String> address) { for (String jid : address) { RosterEntry entry = XMMPManager.connection.getRoster().getEntry(jid); removeContact(entry); removeContact(getContactByJid(jid), getGroupByUser(jid)); } handler.sendEmptyMessage(HandlerMessage.ENTRIESDELETED); } @Override public void entriesUpdated(Collection<String> address) { // TODO Auto-generated method stub } @Override 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就是对应添加和删除好友。无非就是监听这些方法,然后界面发送事件给界面处理,比如下线了,用户头像变灰,用户列表总数对应减少等等。
好友监听的另一部分就是,当好友向你发起“添加您为好友”的通知时,你需要做出拒绝或者接受的选择,然后再通知给用户,用户那边做出选择后再返回给你,这样就完成了添加或拒绝好友的一个过程。这就是具体的思路,我的理解是这样的。下面请看我的代码:
Java代码 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)) { Message msg = new Message(); msg.what = HandlerMessage.UNSUBSCRIBE; String from = presence.getFrom(); Bundle data = new Bundle(); data.putString("from", from); msg.setData(data); handler.sendMessage(msg); } Log.i(ContactManager.class.getCanonicalName(), "type:" + presence.getType()); } }; XMMPManager.connection.addPacketListener(subscribeListener, packetFilter); }
这个方法在XMPP连接后便可调用,表示一开始就监听好友。
关于聊天信息的监听主要使用下面的方法:
Java代码 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); } }
这个方法就是不断地接收用户发过来的消息,当然还需要处理很多细节,这里不列出来了。
获取聊天对象和聊天管理类并添加监听接口:
Java代码 ChatManager chatManager = XMMPManager.connection.getChatManager(); Chat chat = chatManager.createChat(user, null); chatManager.addChatListener(new ChatManagerListenerEx());
user是聊天的对象。下面是监听的实现方法。
Java代码 public class ChatManagerListenerEx implements ChatManagerListener { @Override public void chatCreated(Chat chat, boolean arg1) { chat.addMessageListener(ml); } }
大概就是这样,发送一条信息:
Java代码 chat.sendMessage(content);
相关文章推荐
- 基于XMPP协议的Android IM研究
- 基于XMPP协议的Android IM研究
- 基于XMPP协议的Android IM研究
- 基于XMPP协议的Android IM研究(asmack)
- 基于XMPP协议的Android IM研究,主要讲监听
- 基于XMPP协议的Android IM研究
- 基于XMPP协议的Android IM研究一
- 基于XMPP协议的Android IM研究
- 基于XMPP协议的Android IM研究
- 基于XMPP协议的Android IM研究一
- 基于XMPP协议的Android IM研究
- 基于XMPP协议的Android IM研究
- 基于XMPP协议的Android IM研究(转)
- Android平台下基于XMPP的IM研究
- Android平台下基于XMPP的IM研究(二 MultiUserChat 聊天室)
- Android平台下基于XMPP的IM研究
- Android平台下基于XMPP的IM研究(一)
- Android平台下基于XMPP的IM研究(一)
- Android中基于XMPP协议实现IM聊天程序与多人聊天室
- Android平台下基于XMPP的IM研究(二 MultiUserChat 聊天室)