Android12,你真的适配好了吗?
前言
最近要上架新版本,在小米开放平台收到了要适配Android12的通知,这才赶紧从业务堆里逃出来对Android12进行适配,适配过程也是有一些坑,在这里记录和分享一下,希望大家引以为戒。
适配
关于Android12 适配的特性,网上的博客一搜一大堆,这里不做缀叙,请大家自行百度,这里推荐一篇大佬的
❝ https:// juejin.cn/post/70371050 00480243748
❞
在这里,我只说下我踩坑的地方,可能这些地方也是大家需要注意的地方。
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()