最近要上架新版本,在小米开放平台收到了要适配Android12的通知,这才赶紧从业务堆里逃出来对Android12进行适配,适配过程也是有一些坑,在这里记录和分享一下,希望大家引以为戒。
关于Android12 适配的特性,网上的博客一搜一大堆,这里不做缀叙,请大家自行百度,这里推荐一篇大佬的
juejin.cn/post/703710…
在这里,我只说下我踩坑的地方,可能这些地方也是大家需要注意的地方。
1.android:exported
首先来说下这个点,这个设置主要是设置
Activity
是否可由其他应用的组件启动**, “
true
” 则表示可以,而“
false
”表示不可以。
自己项目中的清单文件比较好配置,主要的难点是,如果使用的第三方库的清单文件并未适配,这就很难受。这块主要有两个方案,hook 编译流程中的清单文件合并task,然后获取到需要合并的清单文件,进行解析并加上
exported
,hook 脚本 在上述提到大佬的文章中有,大家可以借鉴使用。
我采用的是另外一个方案,将三方sdk 清单文件中,未声明
android:exported
的组件,手动添加到自己项目的清单文件中, 因为最后需要进行合并, 所以可以采取这种方式进行加上。
如果三方未适配的少的话,可以采用第二种方案,如果很多的话,还是采用第一种方案比较好。
2.GPS
在Android12 中,获取卫星状态,如果使用
locationManager.addGpsStatusListener(listener);
的话,会直接抛出异常
java.lang.UnsupportedOperationException: GpsStatus APIs not supported, please use GnssStatus APIs instead
需要使用新的监听接口registerGnssStatusCallback(gnssListener)
locationManager = (LocationManager ) context.get ().getSystemService (Context .LOCATION_SERVICE );
locationManager.registerGnssStatusCallback (new GnssStatus .Callback () {
@Override
public void onStarted () {
super .onStarted ();
@Override
public void onStopped () {
super .onStopped ();
@Override
public void onFirstFix (int ttffMillis ) {
super .onFirstFix (ttffMillis);
@Override
public void onSatelliteStatusChanged (@NonNull GnssStatus status ) {
super .onSatelliteStatusChanged (status);
同时退出记得取消监听。
3.蓝牙权限
如果在Android12的系统上 不进行适配的话,会出现搜索不到的情况。
在Android 12 新增了 三个权限:
Manifest.permission.BLUETOOTH_SCAN
,
Manifest.permission.BLUETOOTH_ADVERTISE
,
Manifest.permission.BLUETOOTH_CONNECT
,
以前只需要申请 Manifest.permission.ACCESS_FINE_LOCATION
和 Manifest.permission.ACCESS_COARSE_LOCATION
即可。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (rxPermissions.isGranted(Manifest.permission.BLUETOOTH_SCAN)
&& rxPermissions.isGranted (Manifest.permission.BLUETOOTH_ADVERTISE)
&& rxPermissions.isGranted (Manifest.permission.BLUETOOTH_CONNECT)
permissionResult.onSuccess ();
} else {
disposable = rxPermissions.request (
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_ADVERTISE,
Manifest.permission.BLUETOOTH_CONNECT
.subscribe { granted: Boolean ->
if (granted) {
permissionResult.onSuccess ()
} else {
permissionResult.onFail ()
} else {
if (rxPermissions.isGranted(Manifest.permission.ACCESS_FINE_LOCATION)
&& rxPermissions.isGranted (Manifest.permission.ACCESS_COARSE_LOCATION)
permissionResult.onSuccess ();
} else {
disposable = rxPermissions.request (
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
.subscribe { granted: Boolean ->
if (granted) {
permissionResult.onSuccess ()
} else {
permissionResult.onFail ()
4.WorkManager
使用WorkManager的同学要注意升级到2.7.0+版本,否则会直接报错
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.
大致需要额外注意的点基本上就这些了,希望对大家有所帮助,大家有补充可以相互交流~
217
二流小码农
Flutter
Django
Android
2527
张风捷特烈
Flutter
Android
713
恋猫de小郭
Flutter
Android
254
京东云开发者
Flutter
Android
906
cofbro
Android
RxJava
301
Android Jetpack
Android
449
张风捷特烈
Flutter
Android
5462
不说话的匹诺槽
Android
Android Jetpack
1783
不说话的匹诺槽
Android
Android Jetpack
1043
不说话的匹诺槽
VIP.4 融会贯通
Android开发工程师