如何在Android Studio中使用Smack与Openfire XMPP服务器进行网络通信。

3
我是新手Android编程,现在已经两个月了。 我花了很多时间尝试在发布这篇文章之前找出解决方案。 所以,我会直接提出问题,然后解释一下对我没有起作用的东西。
问题如下(与标题相同):
如何使用Smack 4.1.5和Android Studio 2.1.2与Openfire XMPP Server 4.0.2进行网络连接?最好提供一个简短的、简单的代码片段来登录、发送和接收聊天。否则,强烈的指针将是最受欢迎的。(我漏掉了一个库吗?try-n-catch有什么问题吗?)
MainActivity.java文件如下(我已经注释掉了最后一部分的代码,以便放大问题代码。我最好的判断是,在注释开始之前的那一行出现了问题。但是,这很奇怪,因为这一行几乎与Smack文档推荐的一样。这就是为什么我要求帮助,并在这里说:“提前感谢”。)
(当然,我已经在我的电脑上搭建了一个Openfire XMPP服务器。我还测试了Spark在Openfire XMPP服务器上的连接,并成功发送和接收聊天信息。)
package com.eg.an_smackandchatclc;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.chat.Chat;
import org.jivesoftware.smack.chat.ChatManager;
import org.jivesoftware.smack.chat.ChatManagerListener;
import org.jivesoftware.smack.chat.ChatMessageListener;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.roster.Roster;
import org.jivesoftware.smack.roster.RosterEntry;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import javax.net.ssl.SSLSocketFactory;
import java.util.*;
import java.io.*;
import org.jivesoftware.smack.*;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.*;
import org.jivesoftware.smack.*;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
public class MainActivity extends AppCompatActivity {
//public static final String HOST = "208.68.163.218"; //write your host name
//public static final int PORT = 5222;
private static final String TAG = "MainActivity.java";
//Log.e(TAG, "declaration");
@Override
protected void onCreate(Bundle savedInstanceState) {
    System.out.println("onCreate");
    Log.e(TAG, "onCreate");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    System.out.println("onCreate");
    Log.e(TAG, "setContentView");
    AbstractXMPPConnection conn1 = new XMPPTCPConnection("admin", "admin", "desktop-pc");
}}
/*
    AbstractXMPPConnection conn1 = new XMPPTCPConnection("username", "password", "jabber.org");
    System.out.println("onCreate");
    Log.e(TAG, "conn1");
}}
*/
/*
        try {
        System.out.println("onCreate");
        Log.e(TAG, "try");
        conn1.connect();
    } catch (SmackException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (XMPPException e) {
        e.printStackTrace();
    }
    connect();
    System.out.println("onCreate");
    Log.e(TAG, "connect()");
}

Logcat(仅错误消息)如下:

08-06 08:08:46.405 18663-18663/com.eg.an_smackandchatclc E/MainActivity.java: onCreate
08-06 08:08:46.539 18663-18663/com.eg.an_smackandchatclc E/MainActivity.java: setContentView

08-06 08:08:46.672 18663-18663/com.eg.an_smackandchatclc E/AndroidRuntime: FATAL EXCEPTION: main
                                                                  Process: com.eg.an_smackandchatclc, PID: 18663
                                                                       java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/naming/directory/InitialDirContext;
                                                                           at org.jivesoftware.smack.util.dns.javax.JavaxResolver.<clinit>(JavaxResolver.java:50)
                                                                           at java.lang.Class.classForName(Native Method)
                                                                           at java.lang.Class.forName(Class.java:400)
                                                                           at org.jivesoftware.smack.SmackInitialization.loadSmackClass(SmackInitialization.java:213)
                                                                           at org.jivesoftware.smack.SmackInitialization.parseClassesToLoad(SmackInitialization.java:193)
                                                                           at org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:163)
                                                                           at org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:148)
                                                                           at org.jivesoftware.smack.SmackInitialization.<clinit>(SmackInitialization.java:116)
                                                                           at org.jivesoftware.smack.SmackConfiguration.getVersion(SmackConfiguration.java:96)
                                                                           at org.jivesoftware.smack.AbstractXMPPConnection.<clinit>(AbstractXMPPConnection.java:97)
                                                                           at com.eg.an_smackandchatclc.MainActivity.onCreate(MainActivity.java:62)
                                                                           at android.app.Activity.performCreate(Activity.java:6658)
                                                                           at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                                                                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2584)
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2692)
                                                                           at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1445)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                           at android.os.Looper.loop(Looper.java:154)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6044)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
08-06 08:08:46.672 18663-18663/com.eg.an_smackandchatclc E/AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.naming.directory.InitialDirContext" on path: DexPathList[[dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-support-annotations-24.0.0_87b336946543c1f787a3f9b83be41366f9cdbb84-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-smack-tcp-4.1.5_b0d53c1047a32e900a08ccf219813c5bc2e618c2-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-smack-sasl-provided-4.1.5_084129969859dd9e8f37122e5ef57f0cfd22a46c-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-smack-sasl-javax-4.1.0_0ab65da887f48d8d5e384912160eaa1e0908d186-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-smack-resolver-minidns-4.1.5_0ae177b49eafb38d7b12353d2eda6cc149b4fe43-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-smack-resolver-javax-4.1.0_d306adbf26933e7f728102e3672f3f90637ba1f4-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-smack-java7-4.1.0_dcb0e760478344b0ca249594ceb7373304752bae-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-smack-im-4.1.5_1ecc996e048dc5efba3acddae625e28aedfd704e-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-smack-extensions-4.1.5_4eacc0e2ea2f430835f5aa7fef27c8a657ed75b2-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-smack-core-4.1.5_21299a3731f708b27e7f5f12a5bc6ebf265c7a80-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-smack-android-extensions-4.1.5_ce6630a8dabc9b47414ad59ad934c206078b768c-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-smack-android-4.1.5_d8cd382b84de7e021e8ac21a53fd3e9213386ed4-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-slice_6-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-slice_5-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-slice_4-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-slice_3-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-slice_2-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-slice_1-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-slice_0-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-minidns-0.1.7_4e64c8580258e0c1f1f12d1e7412dad623952782-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-jxmpp-util-cache-0.4.2_108c360a78086927507dd4d9b7a2ad0580db469b-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-jxmpp-core-0.4.2_ee26bb5026023b646554c0bf9ba14c39ffd9a0f5-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-internal_impl-24.0.0_f8e857843a2f013dbed9c33184b5eae71c5fa909-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-com.android.support-support-vector-drawable-24.0.0_c612cdcfcff025f7f2ab5366116677fa236ef2b7-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-com.android.support-support-v4-24.0.0_cdc3a4409b42b56d3a7c52c568071a86579f9e63-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-com.android.support-appcompat-v7-24.0.0_50c6a3f385fbb5da5a5fbefc3749fa4
08-06 08:08:46.672 18663-18663/com.eg.an_smackandchatclc E/AndroidRuntime: abfcd41b4-classes.dex", dex file "/data/data/com.eg.an_smackandchatclc/files/instant-run/dex/slice-com.android.support-animated-vector-drawable-24.0.0_5eae71faeeb4e4b2f9cdde61d342e39a2cdcfcb5-classes.dex"],nativeLibraryDirectories=[/data/app/com.eg.an_smackandchatclc-2/lib/x86_64, /system/lib64, /vendor/lib64]]
                                                                           at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
                                                                           at com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoader.findClass(IncrementalClassLoader.java:90)
                                                                           at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
                                                                           at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
                                                                            ... 23 more

我已经设置了应用程序的build.gradle文件以导入所有适当的库(或者至少我认为我已经做到了)。它们包括:

<Android API 24 Platform>
<1.8>
android-android-24
animated-vector-drawable-24.0.0
appcompat-v7-24.0.0
hamcrest-core-1.3
junit-4.12
jxmpp-core-0.4.2
jxmpp-util-cache-0.4.2
minidns-0.1.7
smack-android-4.1.5
smack-android-extensions-4.1.5
smack-core-4.1.5
smack-extensions-4.1.5
smack-im-4.1.5
smack-java7-4.1.0
smack-resolver-javax-4.1.0
smack-resolver-minidns-4.1.5
smack-sasl-javax-4.1.0
smack-sasl-provided-4.1.5
smack-tcp-4.1.5
support-annotations-24.0.0
support-v4-24.0.0
support-vector-drawable-24.0.0

上面是与问题相关的基本信息。
以下是我在发布这个问题之前尝试做的“作业”。
我仔细阅读了Smack文档(http://download.igniterealtime.org/smack/docs/latest/documentation/)的每一个字。起初,我尝试使用文档中建议的“几行代码”。
```java AbstractXMPPConnection connection = new XMPPTCPConnection("mtucker", "password", "jabber.org");
connection.connect().login();
Chat chat = ChatManager.getInstanceFor(connection) .createChat("jsmith@jivesoftware.com", new MessageListener() {
public void processMessage(Chat chat, Message message) {
System.out.println("Received message: " + message);
}
});
chat.sendMessage("Howdy!"); ```

(http://download.igniterealtime.org/smack/docs/latest/documentation/overview.html)

很不幸,完全没有收获。

然后,我试着测试那一行代码: (哈哈哈。Stack Overflow说我想引用的代码看起来像垃圾邮件,所以我把这个放在了它的位置上。现在它不再有趣了,因为即使前面的句子对SO来说也像垃圾邮件。让我们看看这两个句子是否能让我通过这篇文章。) (哈哈。Stack Overflow说我需要至少10个声望才能发布超过2个链接,所以我想放在这里的链接必须去掉。无论如何,我从Smack文档的“入门”页面中得到了那一行代码。)

但是,仍然没有结果。

相信我,我已经尝试了网络上提出的所有其他解决方案(包括在Stack Overflow上的其他地方),但是我都失败了。每次都会出现某些错误消息。或者,给出的代码示例需要具备比我更高的编码技巧。例如,代码示例可能引用未定义的方法或必须自己创建的类。

所以,再次感谢您提前提供的任何帮助。


从您的依赖项中删除 smack-resolver-javax-4.1.0。 - babadaba
我认为你正在导入许多不必要的东西,请尝试使用以下代码: compile 'org.igniterealtime.smack:smack-android:4.1.6' compile 'org.igniterealtime.smack:smack-tcp:4.1.6' compile "org.igniterealtime.smack:smack-extensions:4.1.6" compile "org.igniterealtime.smack:smack-im:4.1.6" - Lucas Ferraz
2个回答

0

使用Android库

  • org.igniterealtime.smack:smack-android:4.1.6
  • org.igniterealtime.smack:smack-tcp:4.1.6
  • org.igniterealtime.smack:smack-im:4.1.6

这些库足以开始编程。 并非所有的Java库都与Android兼容,特别是javax包。


0

我在使用Smack 4.1.x时遇到了同样的问题(InitialDirContext上的NoClassDefFoundError)。

尝试使用Smack 4.2,在build.gradle中:

    compile "org.igniterealtime.smack:smack-android-extensions:4.2.0-alpha3"
    compile "org.igniterealtime.smack:smack-tcp:4.2.0-alpha3"

这就是我如何初始化连接的。

    private void initializeConnection() {
    try {
        XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                .setHost(mServerAddress)
                .setPort(mServerPort)
                .setXmppDomain(JidCreate.domainBareFrom(mServiceName))
                .setUsernameAndPassword(mUserLogin, mUserPassword)
                .build();

        mXmppTcpConnection = new XMPPTCPConnection(config);

        XmppConnectionListener connectionListener = new XmppConnectionListener();
        mXmppTcpConnection.addConnectionListener(connectionListener);
    } catch (XmppStringprepException e) {
        e.printStackTrace();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接