public class XmppUtil {
/**
* XMPP连接
*/
private static XMPPTCPConnection mXMPPConnection;
/**
* 单聊管理器
*/
private static ChatManager mChatManager;
/**
* smack ping openfire管理器
*/
private static PingManager mPingManager;
/**
* 群聊管理器
*/
private static MultiUserChatManager multiUserChatManager;
/**
* XMPP连接监听
*/
private static CheckConnectionListener checkConnectionListener;
/**
* smack ping openfire失败监听
*/
private static PingServerFailedListener pingServerFailedListener;
/**
* 单聊接收监听
*/
private static MsgListener msgListener;
/**
* 单聊发送监听
*/
private static OutChatListener mOutChatListener;
/**
* 监听邀请加入聊天室
*/
private static MucInvitationListener mucInvitationListener;
/**
* 好友状态更新监听
*/
private static FriendsPacketListener friendsPacketListener;
static {
try {
Class.forName("org.jivesoftware.smack.ReconnectionManager");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @return XMPPConnection是否连接并登陆
*/
public static boolean xmppIsConncetedAndLogin() {
return mXMPPConnection != null && mXMPPConnection.isConnected() && mXMPPConnection.isAuthenticated();
}
/**
* 初始化XMPPConnection并建立连接
*/
public static synchronized void initXMPP() {
// 已经连接并登陆上
if (xmppIsConncetedAndLogin()) {
return;
} else {
// disconnect(); // 先断开连接
initXMPPConfig();
connectXMPP();
}
}
private static void initXMPPConfig() {
try {
SmackConfiguration.DEBUG = true;
// 配置XmppConnection
XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
.setHostAddress(InetAddress.getByName(Const.XMPP_HOST)) // 设置openfire主机IP
.setXmppDomain(Const.XMPP_DOMAIN)
.setHost(Const.XMPP_HOST)
.setPort(Const.XMPP_PORT)
.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) //禁用SSL连接
.setCompressionEnabled(false)
.setSendPresence(false) // 先设离线获取离线消息后再设在线
.setCompressionEnabled(true) // 设置开启压缩,可以节省流量
.setConnectTimeout(30000)
.build();
// 收到好友邀请后manual表示需要经过同意,accept_all表示不经同意自动为好友
Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.accept_all);
mXMPPConnection = new XMPPTCPConnection(config);
//开启重联机制
ReconnectionManager mReconnectionManager = ReconnectionManager.getInstanceFor(mXMPPConnection);
// mReconnectionManager.setFixedDelay(5);
mReconnectionManager.enableAutomaticReconnection();
} catch (Exception e) {
AppLog.debug(XmppUtil.class, "XMPP 配置失败---" + e.getMessage());
}
}
/**
* 连接XMPP
*/
public static void connectXMPP() {
try {
mXMPPConnection.connect();
AppLog.debug(XmppUtil.class, "XMPP连接结果---" + mXMPPConnection.isConnected());
// 使用所有用户统一密码123,需要含参数Resourcepart.from("Smack"),不然每次自动分配一个名字,导致掉线重连的话在openfire看连接名称会变
mXMPPConnection.login(UserConfig.getUserID(), "123", Resourcepart.from("Smack"));
if(mXMPPConnection.isAuthenticated()){
AppLog.debug(XmppUtil.class, "loginXMPP---success");
BroadcastUtil.sendLoginBroadcast(true, false);
//登录成功,设置用户的vcard信息,这个是为了记录昵称,可以不要
VCard vCard = new VCard();
vCard.setNickName(UserConfig.user.getName());
VCardManager.getInstanceFor(mXMPPConnection).saveVCard(vCard);
// 获取离线信息
getOfflineMessage();
//设置上线
setPresence(0);//设置在线状态
// 设置各种监听
addListener();
} else {
AppLog.debug(XmppUtil.class, "loginXMPP----fail");
// initXMPP();
}
} catch (Exception e) {
AppLog.debug(XmppUtil.class, "XMPP connect--Exception---" + e.getMessage());
// initXMPP();
}
}
/**
* 添加各种监听
*/
private static void addListener() {
//添加xmpp连接监听
if (checkConnectionListener == null) {
checkConnectionListener = new CheckConnectionListener();
}
mXMPPConnection.addConnectionListener(checkConnectionListener);
// 添加聊天信息监听
mChatManager = ChatManager.getInstanceFor(mXMPPConnection);
if (msgListener == null) {
msgListener = new MsgListener();
}
mChatManager.addIncomingListener(msgListener);
// 单聊发出监听,估计是对方接收到了才会返回监听,发送是不会返回监听的
// if (mOutChatListener == null) {
// mOutChatListener = new OutChatListener();
// }
// mChatManager.addOutgoingListener(mOutChatListener);
//监听邀请加入聊天室请求
multiUserChatManager = MultiUserChatManager.getInstanceFor(mXMPPConnection);
if (mucInvitationListener == null) {
mucInvitationListener = new MucInvitationListener();
}
multiUserChatManager.addInvitationListener(mucInvitationListener);
// 注册好友状态更新监听
if (friendsPacketListener == null) {
friendsPacketListener = new FriendsPacketListener();
}
StanzaFilter filter = new AndFilter();
mXMPPConnection.addAsyncStanzaListener(friendsPacketListener, filter);
// 自定义IQ请求获取群成员时,需要这个监听接收返回数据,请求在requireMatchUser()
ProviderManager.addIQProvider(TAG_INFO, INFO_NAMESPACE, new ResponseAllMucMemberIQProvider());
// 默认ping间隔 设为180秒
mPingManager = PingManager.getInstanceFor(mXMPPConnection);
mPingManager.setPingInterval(180);
if (pingServerFailedListener == null) {
pingServerFailedListener = new PingServerFailedListener();
Android smack 工具类(包含连接及相关方法)
最新推荐文章于 2021-05-29 05:21:22 发布
本文详细介绍了Android环境下Smack工具类的使用,包括如何建立连接、发送和接收XMPP消息等关键方法,帮助开发者更好地理解和应用Smack库进行即时通讯功能的开发。
摘要由CSDN通过智能技术生成