首页 > 解决方案 > 连接到代理时 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'

}

标签: javaandroidmqtt

解决方案


因为不推荐使用 LocalBroadcastManager 在 build.Gradle 添加了实现 'com.android.support:support-v4:4.4.1'


推荐阅读