如何在 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.
的依赖项
我在模拟器上尝试 运行 简单的应用程序时不断收到以下错误消息,但我不明白为什么。任何帮助将不胜感激:
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.
的依赖项