没有DNS解析器
No DNS resolver active.在初始化xmpp的时候或许会碰到这么个错误,谷歌了一下说是需要SmackAndroid.init(this);初始化一下SmackAndroid,当然别忘了不用的时候onDestroy();
public static SmackAndroid smackAndroid;
smackAndroid = SmackAndroid.init(context);
smackAndroid.onDestroy();
注:因为一般情况下xmpp使用会在整个app的生命周期内,所以这里的SmackAndroid.init(context)中context传值要注意,否则会出现 Are you missing a call to unregisterReceiver()? 情况出现。
关于JID
XMPP的地址叫做JabberID(简写为JID),它用来标示XMPP网络中的各个XMPP实体。JID由三部分组成:domain,node identifier和resource。JID中domain是必不可少的部分。注意:domain和node identifier部分是不分大小写的,但是resource区分大小写。
完整的Jid包括 node identifier@Domain/resource
一定要注意node identifier是不区分大小写的,如果有用友盟推送的话,用友盟的token注册xmpp,服务器不能将注册的username来指定为推送的友盟token,因为android友盟token是区分大小写的(iOS略过,iOS友盟token没有大小写),所以大家有需要(xmpp通讯,友盟推送)这种方案的,可以用token注册,但是推送一定要把token通过message方式发送给服务器。
message发送不同type类型
XMPP的节点是通讯过程中基本的“推”方式,它是一种“发出不管”的机制,来快速进行消息的获取。消息通常用在IM,群聊,提醒和通知,及其他应用。
Message节点有一个type属性,该属性有以下5个可能值,分别起到不同的作用:
normal
normal类型的消息就像邮件消息一样,因为这样的消息都是独立的,可能有反馈,也可能没有;
chat
chat类型的消息用于双方实时回话的数据交换,如朋友之间的即时消息聊天;
groupchat
groupchat类型的消息用于多用户聊天,即群聊,类似于IRC。
headline
headline类型的消息用于发送提醒和通知,对是否有反馈没有要求。
error
当双方前面发送的消息处理过程中有错误发生,该类型的节点就用反馈错误信息。
Message message = new Message();
message.setTo(touser + "@" + Const.XMPP_YOU);//jid
message.setFrom(SharePreferenceUtil.getXmppname() + "@"
+ Const.XMPP_YOU);
message.setBody(content);//发送内容
message.setType(Message.Type.chat);//发送类型
mXMPPConnection.sendPacket(message);
监听不同type类型消息
PacketFilter packetFilter = new PacketTypeFilter(Message.class);
msgListener = new MsgListener(this, mNotificationManager);
mXMPPConnection.addPacketListener(msgListener, packetFilter);
在processPacket里
@Override
public void processPacket(Packet arg0) {
// TODO Auto-generated method stub
Message message = (Message) arg0;
if (message.getType() == Message.Type.chat) {
}else if (message.getType() == Message.Type.headline){
}
}
可以监听到不同type类型的message。