Android12,你真的适配好了吗?

5,937 阅读2分钟

前言

最近要上架新版本,在小米开放平台收到了要适配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_LOCATIONManifest.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.

写在最后

大致需要额外注意的点基本上就这些了,希望对大家有所帮助,大家有补充可以相互交流~