相关文章推荐
飞翔的开心果  ·  SQL ...·  9 月前    · 
傲视众生的电影票  ·  sed.exe & ...·  1 年前    · 
首发于 Android开发那点事儿
Android12,你真的适配好了吗?

Android12,你真的适配好了吗?

前言

最近要上架新版本,在小米开放平台收到了要适配Android12的通知,这才赶紧从业务堆里逃出来对Android12进行适配,适配过程也是有一些坑,在这里记录和分享一下,希望大家引以为戒。

适配

关于Android12 适配的特性,网上的博客一搜一大堆,这里不做缀叙,请大家自行百度,这里推荐一篇大佬的

juejin.cn/post/70371050

在这里,我只说下我踩坑的地方,可能这些地方也是大家需要注意的地方。

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()