openfire+spark+smack 即时通讯(问题篇一)离线消息获取不到
即时通信功能已经开发完毕,现在还木有时间整理,打算后期抽时间整理后发一下源码跟教程。现在记录一下遇到的问题,首先是获取离线消息。
OfflineMessageManager是官方获取离线消息的,但是直接获取,是获取不到任何消息的,需要先设置离线,然后获取后,再上线。功能代码如下。
1、离线
// 初始化 public XMPPConnection init(LoginConfig loginConfig) { Connection.DEBUG_ENABLED = false; ProviderManager pm = ProviderManager.getInstance(); configure(pm); connectionConfig = new ConnectionConfiguration( loginConfig.getXmppHost(), loginConfig.getXmppPort(), loginConfig.getXmppServiceName()); connectionConfig.setSASLAuthenticationEnabled(false);// 不使用SASL验证,设置为false connectionConfig .setSecurityMode(ConnectionConfiguration.SecurityMode.enabled); // 允许自动连接 connectionConfig.setReconnectionAllowed(false); connectionConfig.setSendPresence(false);// 设置离线 // 收到好友邀请后manual表示需要经过同意,accept_all表示不经同意自动为好友 Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual); connection = new XMPPConnection(connectionConfig); return connection; }
2、获取消息
OfflineMessageManager offlineManager = new OfflineMessageManager(connection); try { Log.i("离线消息数量: ", "" + offlineManager.getMessageCount()); Iterator<org.jivesoftware.smack.packet.Message> it = offlineManager.getMessages(); while (it.hasNext()) { org.jivesoftware.smack.packet.Message message = it.next(); Log.i("收到离线消息", "Received from 【" + message.getFrom() + "】 message: " + message.getBody()); if (message != null && message.getBody() != null && !message.getBody().equals("null")) { IMMessage msg = new IMMessage(); String time = (String) message .getProperty(IMMessage.KEY_TIME); msg.setTime(time == null ? DateUtil.getCurDateStr() : time); msg.setContent(message.getBody()); if (Message.Type.error == message.getType()) { msg.setType(IMMessage.ERROR); } else { msg.setType(IMMessage.SUCCESS); } String from = message.getFrom().split("/")[0]; msg.setFromSubJid(from); // 生成通知 NoticeManager noticeManager = NoticeManager .getInstance(context); Notice notice = new Notice(); notice.setTitle("新信息"); notice.setNoticeType(Notice.CHAT_MSG); notice.setContent(message.getBody()); notice.setFrom(from); notice.setStatus(Notice.UNREAD); notice.setNoticeTime(time == null ? DateUtil .getCurDateStr() : time); // 历史记录 IMMessage newMessage = new IMMessage(); newMessage.setMsgType(0); newMessage.setFromSubJid(from); newMessage.setContent(message.getBody()); newMessage.setTime(time == null ? DateUtil.getCurDateStr() : time); MessageManager.getInstance(context).saveIMMessage( newMessage); long noticeId = noticeManager.saveNotice(notice); if (noticeId != -1) { Intent intent = new Intent(Constant.NEW_MESSAGE_ACTION); intent.putExtra(IMMessage.IMMESSAGE_KEY, msg); intent.putExtra("noticeId", noticeId); context.sendBroadcast(intent); activitySupport.setNotiType( R.drawable.ic_launcher, context.getResources().getString( R.string.new_message), notice.getContent(), ChatActivity.class, from); } } } offlineManager.deleteMessages();// 通知服务器删除离线消息 } catch (Exception e) { e.printStackTrace(); }
3、设置上线:
Presence presence = new Presence(Presence.Type.available); connection.sendPacket(presence);
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。