【问题标题】:Very Simple XMPP client in AndroidAndroid中非常简单的XMPP客户端
【发布时间】:2016-01-09 20:33:02
【问题描述】:

我正在尝试使用 XMPP 服务器创建一个基本的消息传递基础架构,并且已经成功地使用 Python 非常优雅地做到了这一点。在 Python 上成功发送和接收小型预定义消息。现在下一个任务是从 Android 手机发送类似的消息。请注意,我真的不需要 Xabber 样式客户端提供的完整聊天客户端功能。

我是 Android 新手,并没有真正研究过 Java、Eclipse。尽管如此,我还是在 Android 中使用了一个基本的“Hello World”程序(空白活动模板),并使用来自igniterealtime 网站的一些基本 XMPP 代码进行了“增强”。所以 MainActivity.java 程序看起来像这样:

package com.yantrajaal.pm1324;

import java.io.IOException;

import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
           configBuilder.setUsernameAndPassword("userid", "xxxxxx");
           //configBuilder.setResource("SomeResource");
           configBuilder.setServiceName("adastra.re");

           AbstractXMPPConnection connection = new XMPPTCPConnection(configBuilder.build());
           // Connect to the server
           try {
            connection.connect();
        } catch (SmackException | IOException | XMPPException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
           // Log into the server
           try {
                connection.login();
            } catch (SmackException | IOException | XMPPException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

我包含的 smack 库是

/home/hduser/workspace/PM1324/libs/smack-tcp-4.1.4.jar
/home/hduser/workspace/PM1324/libs/smack-android-4.1.4.jar
/home/hduser/workspace/PM1324/libs/android-support-v4.jar
/home/hduser/workspace/PM1324/libs/smack-core-4.1.4.jar

/home/hduser/eclipse-android-sdks/platforms/android-23/android.jar

包含这些库并导入各种类后,程序中没有编译时错误:-)

但是,当我在模拟器中执行程序时,程序会在启动时立即崩溃(停止工作)。甚至“Hello World”字符串也没有出现。

日志的相关部分显示如下:

10-12 16:41:42.860: E/AndroidRuntime(893): FATAL EXCEPTION: main
10-12 16:41:42.860: E/AndroidRuntime(893): Process: com.yantrajaal.pm1324, PID: 893
10-12 16:41:42.860: E/AndroidRuntime(893): java.lang.NoClassDefFoundError: org.jxmpp.util.XmppStringUtils
10-12 16:41:42.860: E/AndroidRuntime(893):  at org.jivesoftware.smack.provider.ProviderManager.getKey(ProviderManager.java:314)
10-12 16:41:42.860: E/AndroidRuntime(893):  at org.jivesoftware.smack.provider.ProviderManager.addStreamFeatureProvider(ProviderManager.java:304)
10-12 16:41:42.860: E/AndroidRuntime(893):  at org.jivesoftware.smack.provider.ProviderManager.addLoader(ProviderManager.java:140)
10-12 16:41:42.860: E/AndroidRuntime(893):  at org.jivesoftware.smack.initializer.UrlInitializer.initialize(UrlInitializer.java:54)
10-12 16:41:42.860: E/AndroidRuntime(893):  at org.jivesoftware.smack.SmackInitialization.loadSmackClass(SmackInitialization.java:232)
10-12 16:41:42.860: E/AndroidRuntime(893):  at org.jivesoftware.smack.SmackInitialization.parseClassesToLoad(SmackInitialization.java:193)
10-12 16:41:42.860: E/AndroidRuntime(893):  at org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:163)
10-12 16:41:42.860: E/AndroidRuntime(893):  at org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:148)
10-12 16:41:42.860: E/AndroidRuntime(893):  at org.jivesoftware.smack.SmackInitialization.<clinit>(SmackInitialization.java:116)
10-12 16:41:42.860: E/AndroidRuntime(893):  at org.jivesoftware.smack.SmackConfiguration.getVersion(SmackConfiguration.java:96)
10-12 16:41:42.860: E/AndroidRuntime(893):  at org.jivesoftware.smack.ConnectionConfiguration.<clinit>(ConnectionConfiguration.java:38)
10-12 16:41:42.860: E/AndroidRuntime(893):  at com.yantrajaal.pm1324.MainActivity.onCreate(MainActivity.java:22)
10-12 16:41:42.860: E/AndroidRuntime(893):  at android.app.Activity.performCreate(Activity.java:5231)
10-12 16:41:42.860: E/AndroidRuntime(893):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-12 16:41:42.860: E/AndroidRuntime(893):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
10-12 16:41:42.860: E/AndroidRuntime(893):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
10-12 16:41:42.860: E/AndroidRuntime(893):  at android.app.ActivityThread.access$800(ActivityThread.java:135)
10-12 16:41:42.860: E/AndroidRuntime(893):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
10-12 16:41:42.860: E/AndroidRuntime(893):  at android.os.Handler.dispatchMessage(Handler.java:102)
10-12 16:41:42.860: E/AndroidRuntime(893):  at android.os.Looper.loop(Looper.java:136)
10-12 16:41:42.860: E/AndroidRuntime(893):  at android.app.ActivityThread.main(ActivityThread.java:5001)
10-12 16:41:42.860: E/AndroidRuntime(893):  at java.lang.reflect.Method.invokeNative(Native Method)
10-12 16:41:42.860: E/AndroidRuntime(893):  at java.lang.reflect.Method.invoke(Method.java:515)
10-12 16:41:42.860: E/AndroidRuntime(893):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
10-12 16:41:42.860: E/AndroidRuntime(893):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
10-12 16:41:42.860: E/AndroidRuntime(893):  at dalvik.system.NativeStart.main(Native Method)

如果有人能指导我做错了什么以及如何解决问题,我将不胜感激。

提前感谢您提供的任何建议和指导。

新问题/问题

已经解决了 FATAL EXCEPTION 和 NoClassDefFoundError [参见下面的第二个答案],但现在我遇到了 XMPP 调用的另一个问题。 [我不想就同一个问题创建另一个问题,所以我在这里继续]

现在程序执行,没有中止但无法连接到 XMPP 服务器,并且日志显示以下警告。

10-13 08:48:44.065: W/System.err(1049): org.jivesoftware.smack.SmackException$ConnectionException: The following addresses failed: 'adastra.re:5222' failed because android.os.NetworkOnMainThreadException
10-13 08:48:44.085: W/System.err(1049):     at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectUsingConfiguration(XMPPTCPConnection.java:596)
10-13 08:48:44.085: W/System.err(1049):     at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java:830)
10-13 08:48:44.085: W/System.err(1049):     at org.jivesoftware.smack.AbstractXMPPConnection.connect(AbstractXMPPConnection.java:360)
10-13 08:48:44.095: W/System.err(1049):     at com.example.pm707.MainActivity.onCreate(MainActivity.java:32)
10-13 08:48:44.095: W/System.err(1049):     at android.app.Activity.performCreate(Activity.java:5231)
10-13 08:48:44.095: W/System.err(1049):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-13 08:48:44.095: W/System.err(1049):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
10-13 08:48:44.095: W/System.err(1049):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
10-13 08:48:44.095: W/System.err(1049):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
10-13 08:48:44.095: W/System.err(1049):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
10-13 08:48:44.095: W/System.err(1049):     at android.os.Handler.dispatchMessage(Handler.java:102)
10-13 08:48:44.095: W/System.err(1049):     at android.os.Looper.loop(Looper.java:136)
10-13 08:48:44.095: W/System.err(1049):     at android.app.ActivityThread.main(ActivityThread.java:5001)
10-13 08:48:44.095: W/System.err(1049):     at java.lang.reflect.Method.invokeNative(Native Method)
10-13 08:48:44.095: W/System.err(1049):     at java.lang.reflect.Method.invoke(Method.java:515)
10-13 08:48:44.095: W/System.err(1049):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
10-13 08:48:44.095: W/System.err(1049):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
10-13 08:48:44.095: W/System.err(1049):     at dalvik.system.NativeStart.main(Native Method)
10-13 08:48:44.095: W/System.err(1049): org.jivesoftware.smack.SmackException$NotConnectedException: Client is not, or no longer, connected
10-13 08:48:44.155: W/System.err(1049):     at org.jivesoftware.smack.tcp.XMPPTCPConnection.throwNotConnectedExceptionIfAppropriate(XMPPTCPConnection.java:334)
10-13 08:48:44.155: W/System.err(1049):     at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java:447)
10-13 08:48:44.165: W/System.err(1049):     at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java:410)
10-13 08:48:44.165: W/System.err(1049):     at com.example.pm707.MainActivity.onCreate(MainActivity.java:39)
10-13 08:48:44.165: W/System.err(1049):     at android.app.Activity.performCreate(Activity.java:5231)
10-13 08:48:44.165: W/System.err(1049):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-13 08:48:44.165: W/System.err(1049):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
10-13 08:48:44.165: W/System.err(1049):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
10-13 08:48:44.175: W/System.err(1049):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
10-13 08:48:44.175: W/System.err(1049):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
10-13 08:48:44.185: W/System.err(1049):     at android.os.Handler.dispatchMessage(Handler.java:102)
10-13 08:48:44.185: W/System.err(1049):     at android.os.Looper.loop(Looper.java:136)
10-13 08:48:44.185: W/System.err(1049):     at android.app.ActivityThread.main(ActivityThread.java:5001)
10-13 08:48:44.185: W/System.err(1049):     at java.lang.reflect.Method.invokeNative(Native Method)
10-13 08:48:44.185: W/System.err(1049):     at java.lang.reflect.Method.invoke(Method.java:515)
10-13 08:48:44.185: W/System.err(1049):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
10-13 08:48:44.185: W/System.err(1049):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
10-13 08:48:44.185: W/System.err(1049):     at dalvik.system.NativeStart.main(Native Method)
10-13 08:48:44.355: D/(1049): HostConnection::get() New Host Connection established 0xb8104c50, tid 1049
10-13 08:48:44.415: W/EGL_emulation(1049): eglSurfaceAttrib not implemented

如果您有任何解决此问题的想法,我们将不胜感激

【问题讨论】:

标签: android xmpp


【解决方案1】:

Smack jar 应该在 runtime 中可供应用程序使用,但 android.jar - 已经存在于每个 android 设备上,并且应该只能在 compile time 中由编译器访问。 NoClassDefFoundError 表示应用找不到 smack 库,因为它们包含在您的目标 apk 中,因此问题出在您的构建配置中。

【讨论】:

    【解决方案2】:

    问题已解决如下。 所有 smack jars 都从所有库中物理移除。 然后我在How to use Smack 4.1 on Android 上查看了这个先前的答案 这将我带到Smack Readme and Upgrade Guide。 我下载了 python3 文件,按照说明创建了 artifact.csv 文件并运行了 python3 脚本。这在我的项目文件夹中安装了所有 smack 4.1 的东西。

    由于其他错误,程序仍然无法运行,但是NoClassDefFound的这个问题已经解决了。

    【讨论】:

    • 第二个问题已通过使用 AsyncTask 解决...因为 Android 不允许从主线程进行网络操作
    猜你喜欢
    • 2013-08-26
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    相关资源
    最近更新 更多