java - 连接到代理时 MQTT Android Studio 应用程序崩溃
问题描述
我正在尝试通过一个简单的按钮将消息发布到我的 MQTT 代理(这是我的 Raspberry Pi),主题为“anlage”。当我按下按钮时,应用程序崩溃并出现此错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: de.keule.contollerphone, PID: 16703
java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/localbroadcastmanager/content/LocalBroadcastManager;
at org.eclipse.paho.android.service.MqttAndroidClient.registerReceiver(MqttAndroidClient.java:450)
at org.eclipse.paho.android.service.MqttAndroidClient.connect(MqttAndroidClient.java:428)
at org.eclipse.paho.android.service.MqttAndroidClient.connect(MqttAndroidClient.java:334)
at de.keule.contollerphone.MainActivity.sendMqttMsg(MainActivity.java:43)
at de.keule.contollerphone.MainActivity.onCreate(MainActivity.java:32)
at android.app.Activity.performCreate(Activity.java:7144)
at android.app.Activity.performCreate(Activity.java:7135)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1297)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2944)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3099)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1829)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:215)
at android.app.ActivityThread.main(ActivityThread.java:6910)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.localbroadcastmanager.content.LocalBroadcastManager" on path: DexPathList[[zip file "/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/base.apk", zip file "/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/split_lib_dependencies_apk.apk", zip file "/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/split_lib_resources_apk.apk", zip file "/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/split_lib_slice_0_apk.apk", zip file "/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/split_lib_slice_1_apk.apk", zip file "/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/split_lib_slice_2_apk.apk", zip file "/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/split_lib_slice_3_apk.apk", zip file "/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/split_lib_slice_4_apk.apk", zip file "/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/split_lib_slice_5_apk.apk", zip file "/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/split_lib_slice_6_apk.apk", zip file "/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/split_lib_slice_7_apk.apk", zip file "/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/split_lib_slice_8_apk.apk", zip file "/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/lib/arm64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at org.eclipse.paho.android.service.MqttAndroidClient.registerReceiver(MqttAndroidClient.java:450)
at org.eclipse.paho.android.service.MqttAndroidClient.connect(MqttAndroidClient.java:428)
at org.eclipse.paho.android.service.MqttAndroidClient.connect(MqttAndroidClient.java:334)
at de.keule.contollerphone.MainActivity.sendMqttMsg(MainActivity.java:43)
at de.keule.contollerphone.MainActivity.onCreate(MainActivity.java:32)
at android.app.Activity.performCreate(Activity.java:7144)
at android.app.Activity.performCreate(Activity.java:7135)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1297)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2944)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3099)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1829)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:215)
at android.app.ActivityThread.main(ActivityThread.java:6910)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Suppressed: java.io.IOException: No original dex files found for dex location /data/app/de.keule.contollerphone-kCw6W4HAAaPrigb6bwXOQg==/split_lib_resources_apk.apk
at dalvik.system.DexFile.openDexFileNative(Native Method)
at dalvik.system.DexFile.openDexFile(DexFile.java:354)
at dalvik.system.DexFile.<init>(DexFile.java:101)
at dalvik.system.DexFile.<init>(DexFile.java:75)
at dalvik.system.DexPathList.loadDexFile(DexPathList.java:394)
at dalvik.system.DexPathList.makeDexElements(DexPathList.java:354)
at dalvik.system.DexPathList.<init>(DexPathList.java:164)
at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:74)
at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:65)
at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:64)
at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:73)
at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:88)
at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:74)
at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:40)
at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:731)
at android.app.LoadedApk.getClassLoader(LoadedApk.java:814)
at android.app.LoadedApk.getResources(LoadedApk.java:1036)
at android.app.ContextImpl.createAppContext(ContextImpl.java:2345)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5956)
at android.app.ActivityThread.access$1100(ActivityThread.java:201)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1669)
... 6 more
我错过了什么还是我必须添加一些东西?我已经通过 maven 导入了 mqtt 库 paho org.eclipse.paho:org.eclipse.paho.android.service:1.1.1 和 org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0。是否有另一种在 Android Studio 中实现 mqtt 的方法,或者我可以做些什么来让它工作。我已经在网上搜索过这个问题,但我没有找到任何解决方案。
我已授予该应用此权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--<uses-permission android:name="android.permission.READ_PHONE_STATE" />-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
并且还添加了
<service android:name="org.eclipse.paho.android.service.MqttService" />
那是代码:
public void sendMqttMsg(){
androidClient = new MqttAndroidClient(this, "tcp://192.168.178.41:1883", "phoneController");
options = new MqttConnectOptions();
options.setCleanSession(true);
options.setAutomaticReconnect(true);
MqttMessage msg = new MqttMessage("1".getBytes());
try {
androidClient.connect(options);
androidClient.publish("anlage", msg);
androidClient.disconnect();
}catch(MqttException e){
e.printStackTrace();
}
}
编辑:build.gradle
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
}
解决方案
因为不推荐使用 LocalBroadcastManager 在 build.Gradle 添加了实现 'com.android.support:support-v4:4.4.1'
推荐阅读
- python - 如何将帧数组转换为帧对数组?
- python - 如何使用 `pyinstaller` 捆绑安装 Anaconda 的 paraview 包
- json - 在颤振中解析json对象
- mysql - 为什么我的 Heroku 应用程序不能在 Heroku URL 上运行,即使我设置了 SECRET_KEY_BASE 的环境变量?
- ios - 同步 SceneKit 与其他 Renderer 渲染
- c++ - uv_ip4_name 总是得到 127.0.0.1
- css - 容器使用最大高度和最小高度自动调整高度
- powershell - Set-Clipboard 仅在快速连续调用时记住最后一个值
- python - 带有张量流的拥抱脸转换器将两个文件保存为模型权重
- python - 在 Scikit 中使用管道输入值