0

I am trying to publish a message to my MQTT broker(which is my Raspberry Pi) for the topic "anlage" via a simple button. When I press the button the app crashes and I get this error:

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

Does I miss something or I have to add somthingelse? I've imported the mqtt library paho org.eclipse.paho:org.eclipse.paho.android.service:1.1.1 and org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0 via maven. Is ther another way to implement mqtt in Android Studio or what can I do to get it work. I've already searched for the problem on the web but I didn't found any solution.

I've gave the app this permissions:

<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" />

and also added

<service android:name="org.eclipse.paho.android.service.MqttService" />

Thats the code:

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();
  }
}

Edit: 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'

}

Keule 2
  • 1
  • 2

2 Answers2

0

Because LocalBroadcastManager is deprecated In the build.Gradle added implementation 'com.android.support:support-v4:4.4.1'

  • This doesn't work. It tells me that this version isn't anymore supported and I shut migrate to AndroidX. When I do that, it replaces the 'com.android.support:support-v4:4.4.1' to implementation 'androidx.legacy:legacy-support-v4:1.0.0' which I already tried but didn't worked. – Keule 2 May 23 '20 at 19:41
  • Version 28 (intended for Android Pie and below) is the last version of the legacy support library, so we recommend that you migrate to AndroidX libraries when using Android Q and moving forward. The IDE can help with this: Refactor > Migrate to AndroidX... less... (Strg+F1) Inspection info:There are some combinations of libraries, or tools and libraries, that are incompatible, or can lead to bugs. One such incompatibility is compiling with a version of the Android support libraries that is not the latest version (or in particular, a version lower than your targetSdkVersion). – Keule 2 May 23 '20 at 19:41
0

add this in build.gradle implementation'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'

Procrastinator
  • 2,526
  • 30
  • 27
  • 36