Android12+MQTT

2年前设计的一款APP,现已不支持Android12版本,运行时会出现闪退现象,通过debug发现错误提示如下:

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.

这是由于在旧版本的MQTT库实现中没有使用FLAG_IMMUTABLE。出现这个问题,第一个想法就是下载源文件,修改库,但是在实际操作的过程中发现配置环境一直出错,遂选择放弃。在网上搜索发现已经有大佬将这个库修复,我只需要直接导入即可。

Github的地址:GitHub - ElectApp/MyMQTT: MQTT Android Service (Modified from paho.mqtt.android)

针对如何使用这个库,也有博主提供了相应的教程:Android 12+ MQTT适配_android mqttandroidclient android 12-CSDN博客

但是当我按照上述教程实际操作时却频繁出错,考虑到使用的也是MqttService这个类,不如直接将其相关文件作为包加载到项目中。

修改过程

以下是本人的操作过程:

1. 下载github链接的文件

在D:\Android_project\MyMQTT\mqtt\src\main\java中复制com文件夹并将其粘贴到项目中的java文件夹下(project视图下),如下所示:

2. 修改项目的build.gradle,如下所示(如果项目中使用了android.support 建议全部升级为androidx)

dependencies {
    implementation 'androidx.appcompat:appcompat:1.4.2'
    implementation 'com.google.android.material:material:1.6.1'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.annotation:annotation:1.5.0'
    implementation 'androidx.fragment:fragment:1.5.6'
}

3. 修改AndroidManifest.xml文件,将原来的Mqttservice换成下面的语句

<service android:name="com.somsakelect.android.mqtt.MqttService" />

添加权限

<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" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>

不添加权限也会出现闪退现象。

 4. 在AndroidManifest.xml中修改后,在使用MqttService的java类中也要作相应的修改,将它们都换成com.somsakelect.android.mqtt.MqttService。

可能出现的错误

在运行的时候可能会出现错误

Cannot get GradlePropertiesModel (V2) for project 'GradleProject{path=':app'}'

解决方法:关闭Android studio, 打开C:/用户/xxx/AppData/Local/Android studio并删除这个文件夹下的内容。

Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91
    is also present at [androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory).
    Suggestion: add 'tools:replace="android:appComponentFactory"' to <application> element at AndroidManifest.xml:11:5-38:19 to override.

 Android Support库和Android X库定义了相同的应用组件工厂,Gradle不知道应该选择哪个工厂。

解决方法:将Android Support升级为androidx

以上就是关于此次升级的一次记录,虽然步骤比较简单,但是在实际操作的过程中却挣扎了很久,尽管目前能够支持Android12,但是在Android14下仍然会出现闪退,初步了解是由于Android14的权限更加复杂,下一篇博文将介绍如何修改使其支持Android14.

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值