如何在 android studio 中使用 smack 4.1?
how to use smack 4.1 in android studio?
根据项目经理的要求,我们需要使用 https://github.com/igniterealtime/Smack 进行 xmpp 连接,而不是旧的 aSmack 库。
但是我发现,新的 xmpp 库 igniterealtime 对 android studio IDE 用户不友好,在我的项目中使用这个库后,我无法将它连接到我们的 xmpp 服务器。
问题 1:如何使这个新库正常工作?
问题2:如何向xmpp服务器发送信息查询包,即如何向服务器发送“<iq>...</iq>
”来查询一些信息?
问候问题 1:
首先,更改应用级别 build.gradle:
将以下内容添加到您的依赖项部分:
compile ("org.igniterealtime.smack:smack-android:4.1.0") {
exclude group: 'xpp3', module: 'xpp3'
}
// Optional for XMPPTCPConnection
compile ("org.igniterealtime.smack:smack-tcp:4.1.0") {
exclude group: 'xpp3', module: 'xpp3'
}
// Optional for XMPP-IM (RFC 6121) support (Roster, Threaded Chats, …)
compile ("org.igniterealtime.smack:smack-im:4.1.0") {
exclude group: 'xpp3', module: 'xpp3'
}
将以下内容添加到您的存储库部分:
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
mavenCentral()
已经将igniterealtime xmpp库包含到项目中,我们现在可以使用它了。
XMPPTCPConnectionConfiguration cfg = XMPPTCPConnectionConfiguration.builder()
.setServiceName("online.yourdomain.com")
.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
.setCompressionEnabled(false)
.setDebuggerEnabled(true)
.build();
XMPPTCPConnection xmppConnection = new XMPPTCPConnection(cfg);
xmppConnection.connect();
if (!xmppConnection.isAuthenticated()) {
try {
xmppConnection.login(jabberId, yourSessionStr, resourceID);
} catch (SmackException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
问候问题 2:
String XMPP_NAMESPACE = "myapp:notification";
SimpleIQ iq = new SimpleIQ("query", XMPP_NAMESPACE) {
@Override
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
xml.attribute("action", "list");
xml.rightAngleBracket();
xml.element("from", lastDisconnectedTime + "");
return xml;
}
};
iq.setType(IQ.Type.get);
try {
xmppConnection.sendPacket(iq);
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
ps: 我发现发送IQ包不如使用asmack方便。这是发送 IQ 数据包的旧方法。
IQ iq = new IQ() {
@Override
public String getChildElementXML() {
String query = "<query xmlns=\'" + XMPP_NAMESPACE + "\' action=\'list\'>";
query += "<from>" + lastDisconnectedTime + "</from>";
query += "</query>";
return query;
}
};
iq.setType(Type.GET);
xmppConnection.sendPacket(iq);
注意:我在创建XMPPTCPConnectionConfiguration时必须关闭安全模式,否则无法建立xmpp连接。如果你想让这个 xmpp 连接安全,你必须先创建你自己的 bks 证书文件,然后在你的 xmpp 连接中使用它。
根据项目经理的要求,我们需要使用 https://github.com/igniterealtime/Smack 进行 xmpp 连接,而不是旧的 aSmack 库。 但是我发现,新的 xmpp 库 igniterealtime 对 android studio IDE 用户不友好,在我的项目中使用这个库后,我无法将它连接到我们的 xmpp 服务器。
问题 1:如何使这个新库正常工作?
问题2:如何向xmpp服务器发送信息查询包,即如何向服务器发送“<iq>...</iq>
”来查询一些信息?
问候问题 1: 首先,更改应用级别 build.gradle:
将以下内容添加到您的依赖项部分:
compile ("org.igniterealtime.smack:smack-android:4.1.0") {
exclude group: 'xpp3', module: 'xpp3'
}
// Optional for XMPPTCPConnection
compile ("org.igniterealtime.smack:smack-tcp:4.1.0") {
exclude group: 'xpp3', module: 'xpp3'
}
// Optional for XMPP-IM (RFC 6121) support (Roster, Threaded Chats, …)
compile ("org.igniterealtime.smack:smack-im:4.1.0") {
exclude group: 'xpp3', module: 'xpp3'
}
将以下内容添加到您的存储库部分:
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
mavenCentral()
已经将igniterealtime xmpp库包含到项目中,我们现在可以使用它了。
XMPPTCPConnectionConfiguration cfg = XMPPTCPConnectionConfiguration.builder()
.setServiceName("online.yourdomain.com")
.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
.setCompressionEnabled(false)
.setDebuggerEnabled(true)
.build();
XMPPTCPConnection xmppConnection = new XMPPTCPConnection(cfg);
xmppConnection.connect();
if (!xmppConnection.isAuthenticated()) {
try {
xmppConnection.login(jabberId, yourSessionStr, resourceID);
} catch (SmackException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
问候问题 2:
String XMPP_NAMESPACE = "myapp:notification";
SimpleIQ iq = new SimpleIQ("query", XMPP_NAMESPACE) {
@Override
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
xml.attribute("action", "list");
xml.rightAngleBracket();
xml.element("from", lastDisconnectedTime + "");
return xml;
}
};
iq.setType(IQ.Type.get);
try {
xmppConnection.sendPacket(iq);
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
ps: 我发现发送IQ包不如使用asmack方便。这是发送 IQ 数据包的旧方法。
IQ iq = new IQ() {
@Override
public String getChildElementXML() {
String query = "<query xmlns=\'" + XMPP_NAMESPACE + "\' action=\'list\'>";
query += "<from>" + lastDisconnectedTime + "</from>";
query += "</query>";
return query;
}
};
iq.setType(Type.GET);
xmppConnection.sendPacket(iq);
注意:我在创建XMPPTCPConnectionConfiguration时必须关闭安全模式,否则无法建立xmpp连接。如果你想让这个 xmpp 连接安全,你必须先创建你自己的 bks 证书文件,然后在你的 xmpp 连接中使用它。