如何在 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 连接中使用它。