如何在 android-8 中实例化 StaxXmlPullParserFactory?

how to instantiate an StaxXmlPullParserFactory in android-8?

我在模拟器上尝试 运行 简单的应用程序时不断收到以下错误消息,但我不明白为什么。任何帮助将不胜感激:

2022-01-19 21:00:38.935 13581-13581/com.thecircle.circle_beta E/AndroidRuntime:致命异常:main 进程:com.thecircle.circle_beta,PID:13581 java.util.ServiceConfigurationError: org.jivesoftware.smack.xml.XmlPullParserFactory: 无法实例化提供者 org.jivesoftware.smack.xml.stax.StaxXmlPullParserFactory 在 java.util.ServiceLoader.fail(ServiceLoader.java:233) 在 java.util.ServiceLoader.access100 美元(ServiceLoader.java:183) 在 java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:392) 在 java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:416) 在 java.util.ServiceLoader$1.next(ServiceLoader.java:494) 在 org.jivesoftware.smack.xml.SmackXmlParser.getXmlPullParserFactory(SmackXmlParser.java:44) 在 org.jivesoftware.smack.xml.SmackXmlParser.newXmlParser(SmackXmlParser.java:65) 在 org.jivesoftware.smack.util.PacketParserUtils.getParserFor(PacketParserUtils.java:80) 在 org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:159) 在 org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:154) 在 org.jivesoftware.smack.SmackInitialization.(SmackInitialization.java:103) 在 org.jivesoftware.smack.Smack.getVersion(Smack.java:38) 在 org.jivesoftware.smack.Smack.ensureInitialized(Smack.java:64) 在 org.jivesoftware.smack.ConnectionConfiguration.(ConnectionConfiguration.java:115) 在 org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration.builder(XMPPTCPConnectionConfiguration.java:64) 在 com.thecircle.circle_beta.xmpp.XMPPHandler.connect(XMPPHandler.java:30) 在 com.thecircle.circle_beta.PhoneNumberActivity.startXmppService(PhoneNumberActivity.java:62) 在 com.thecircle.circle_beta.PhoneNumberActivity.access$400(PhoneNumberActivity.java:27) 在 com.thecircle.circle_beta.PhoneNumberActivity$1.onClick(PhoneNumberActivity.java:53) 在 android.view.View.performClick(View.java:7448) 在 com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131) 在 android.view.View.performClick 内部(View.java:7425) 在 android.view.View.access3600 美元(View.java:810) 在 android.view.View$PerformClick.run(View.java:28305) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 原因:java.lang.NoClassDefFoundError:解析失败:Ljavax/xml/stream/XMLInputFactory; 在 org.jivesoftware.smack.xml.stax.StaxXmlPullParserFactory.(StaxXmlPullParserFactory.java:30) 在 java.lang.Class.newInstance(本机方法) 在 java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:388) 在 java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:416) 在 java.util.ServiceLoader$1.next(ServiceLoader.java:494) 在 org.jivesoftware.smack.xml.SmackXmlParser.getXmlPullParserFactory(SmackXmlParser.java:44) 在 org.jivesoftware.smack.xml.SmackXmlParser.newXmlParser(SmackXmlParser.java:65) 在 org.jivesoftware.smack.util.PacketParserUtils.getParserFor(PacketParserUtils.java:80) 在 org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:159) 在 org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:154) 在 org.jivesoftware.smack.SmackInitialization.(SmackInitialization.java:103) 在 org.jivesoftware.smack.Smack.getVersion(Smack.java:38) 在 org.jivesoftware.smack.Smack.ensureInitialized(Smack.java:64) 在 org.jivesoftware.smack.ConnectionConfiguration.(ConnectionConfiguration.java:115) 在 org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration.builder(XMPPTCPConnectionConfiguration.java:64) 在 com.thecircle.circle_beta.xmpp.XMPPHandler.connect(XMPPHandler.java:30) 在 com.thecircle.circle_beta.PhoneNumberActivity.startXmppService(PhoneNumberActivity.java:62) 在 com.thecircle.circle_beta.PhoneNumberActivity.access$400(PhoneNumberActivity.java:27) 在 com.thecircle.circle_beta.PhoneNumberActivity$1.onClick(PhoneNumberActivity.java:53) 在 android.view.View.performClick(View.java:7448) 在 com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131) 在 android.view.View.performClick 内部(View.java:7425) 在 android.view.View.access3600 美元(View.java:810) 在 android.view.View$PerformClick.run(View.java:28305) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 原因:java.lang.ClassNotFoundException:在路径上找不到 class“javax.xml.stream.XMLInputFactory”:DexPathList[[zip 文件“/data/app/~~aqFATXxhdyAHQijKIOYWXw==/com.thecircle.circle_beta-k5LiJXZwDyvcFdkQlSjhkw==/base.apk"],nativeLibraryDirectories=[/data/app/~~aqFATXxhdyAHQijKIOYWXw==/com.thecircle.circle_beta-k5LiJXZwDyvcFdkQlSjhkw==/lib/x86_64,/system/lib64, /system_ext/lib64]] 在 dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:379) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:312) 在 org.jivesoftware.smack.xml.stax.StaxXmlPullParserFactory.(StaxXmlPullParserFactory.java:30) 在 java.lang.Class.newInstance(本机方法) 在 java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:388) 在 java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:416) 在 java.util.ServiceLoader$1.next(ServiceLoader.java:494) 在 org.jivesoftware.smack.xml.SmackXmlParser.getXmlPullParserFactory(SmackXmlParser.java:44) 在 org.jivesoftware.smack.xml.SmackXmlParser.newXmlParser(SmackXmlParser.java:65) 在 org.jivesoftware.smack.util.PacketParserUtils.getParserFor(PacketParserUtils.java:80) 在 org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:159) 在 org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.java:154) 在 org.jivesoftware.smack.SmackInitialization.(SmackInitialization.java:103) 在 org.jivesoftware.smack.Smack.getVersion(Smack.java:38) 在 org.jivesoftware.smack.Smack.ensureInitialized(Smack.java:64) 在 org.jivesoftware.smack.ConnectionConfiguration.(ConnectionConfiguration.java:115) 在 org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration.builder(XMPPTCPConnectionConfiguration.java:64) 在 com.thecircle.circle_beta.xmpp.XMPPHandler.connect(XMPPHandler.java:30) 在 com.thecircle.circle_beta.PhoneNumberActivity.startXmppService(PhoneNumberActivity.java:62) 在 com.thecircle.circle_beta.PhoneNumberActivity.access$400(PhoneNumberActivity.java:27) 在 com.thecircle.circle_beta.PhoneNumberActivity$1.onClick(PhoneNumberActivity.java:53) 在 android.view.View.performClick(View.java:7448) 在 com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131) 在 android.view.View.performClick 内部(View.java:7425) 在 android.view.View.access3600 美元(View.java:810) 在 android.view.View$PerformClick.run(View.java:28305) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

我只是 运行 下面的代码:

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.content.Context;
import android.util.Xml;

import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.android.AndroidSmackInitializer;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jivesoftware.smack.xml.XmlPullParser;
import org.jxmpp.stringprep.XmppStringprepException;

import java.io.IOException;


public class XMPPHandler extends AppCompatActivity {
    private XMPPTCPConnection connection;
    //private XMPPTCPConnectionConfiguration config;

    public void connect() throws IOException, InterruptedException, XMPPException, SmackException {

        XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                .setXmppDomain("192.168.1.9")
                .setHost("192.168.1.9")
                .setPort(5222)
                .setSecurityMode(ConnectionConfiguration.SecurityMode.ifpossible)
                .build();
        connection = new XMPPTCPConnection(config);
        connection.connect();
    }

    //LOGIN
    public void login(String username, String password) throws XMPPException, InterruptedException, IOException, SmackException {
        if (connection!=null && connection.isConnected()) {
            connection.login(username, password);
        }

    }
}

您的 Smack 依赖声明可能是错误的,因为 Android 上没有使用 smack-xmlparser-stax(因为 Android 中没有 StAX 解析器)。而是在 Android 中使用 smack-xmlparser-xpp3,它是 smack-android.

的依赖项