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.