kotlin Android paho mqtt崩溃Android 12 -以S+(版本31及更高版本)为目标需要FLAG_IMMUTABLE或FLAG_MUTABLE之一

mwkjh3gx  于 2023-02-24  发布在  Kotlin
关注(0)|答案(6)|浏览(2333)

我正在使用“org.eclipse.paho:org.eclipse. paho.client.mqttv3:1.2.5”进行mqtt服务,应用程序在android 12设备上不断崩溃,崩溃日志如下

java.lang.IllegalArgumentException: app id: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
    Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
        at android.app.PendingIntent.checkFlags(PendingIntent.java:382)
        at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:673)
        at android.app.PendingIntent.getBroadcast(PendingIntent.java:660)
        at org.eclipse.paho.android.service.AlarmPingSender.start(AlarmPingSender.java:76)
        at org.eclipse.paho.client.mqttv3.internal.ClientState.connected(ClientState.java:1214)
        at org.eclipse.paho.client.mqttv3.internal.ClientState.notifyReceivedAck(ClientState.java:1050)
        at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:151)

这是我正在使用的库:

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
xqkwcwgp

xqkwcwgp1#

Eclipse Paho MQTT library没有针对Android 12待定Intents进行更新。在此之前,我们可以使用this MQTT client。我建议使用gradle依赖项,而不是使用myself's answer中建议的jar文件。
在App Gradle中,注解此eclipse服务依赖性:

implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

在当前版本为3.3.5的地方添加以下内容(& A):

//new mqtt library that supports android 12
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.github.hannesa2:paho.mqtt.android:3.3.5'

不要删除Eclipse客户机依赖性,

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5

对于导入,请删除此eclipse导入

import org.eclipse.paho.android.service.MqttAndroidClient;

将其替换为新的(& R):

import info.mqtt.android.service.MqttAndroidClient;

对于MQTT android客户端,添加最后一个Ack参数,如下所示

client = new MqttAndroidClient(context, serverURI, clientId, Ack.AUTO_ACK);

另外,如果您在MqttException中使用try catch,那么您可以注解它,因为新库不需要相同的内容。

wmvff8tz

wmvff8tz2#

如果你使用的是MQTT库,他们还没有为Android 12更新。所以当你使用Android 12作为目标版本时,它会在PendingIntent中抛出一个错误。作为一个临时的解决方案,我找到了一个库,他们已经升级为兼容Android 12。MQTT service library
下载“serviceLibrary-release.aar”并将其添加到您的项目中。然后从Gradle中移除“org.eclipse.paho:org.eclipse.paho.android.service:1.1.1”依赖项。无论您在使用什么,都可以使用“import info.mqtt.android.service.MqttAndroidClient”。
How to import aar file
这解决了我的MQTT库问题。

oyt4ldly

oyt4ldly3#

您需要将"挂起意向. FLAG_ONE_SHOT"或"挂起意向. FLAG_UPDATE_CURRENT"替换为"挂起意向. FLAG_UPDATE_CURRENT|挂起意向标志_IMMUTABLE "
示例:
alarmIntent =待处理意图. getBroadcast(上下文,0,新意图(上下文,自动启动接收器.类),待处理意图. FLAG_UPDATE_CURRENT|待定意向标志_IMMUTABLE);

eh57zj3b

eh57zj3b4#

这是从paho.mqtt.android库修改而来的Java library。已针对Android 12修复

lztngnrs

lztngnrs5#

解决这个问题的最好方法是编辑源代码。为此,将所有库文件复制到项目中,然后打开AlarmPingSender.java文件,在第75行附近找到下面的代码:

pendingIntent = PendingIntent.getBroadcast(service, 0, new Intent(
                action), PendingIntent.FLAG_UPDATE_CURRENT)

将代码替换为以下代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        pendingIntent = PendingIntent.getBroadcast(service, 0, new Intent(
                action), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
    } else {
        pendingIntent = PendingIntent.getBroadcast(service, 0, new Intent(
                action), PendingIntent.FLAG_UPDATE_CURRENT);

    }

现在用新的文件替换你的“import”。这样应该可以解决问题。

92vpleto

92vpleto6#

更新firebase库:
实现平台(“com.google.firebase:firebase-bom:29.1.0”)实现“com.google.firebase:firebase-消息传递”
并删除实现“com.google.firebase:firebase消息传递:23.0.0”

相关问题