android新版本适配-android13最全适配方案
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
前言
适配Android13事不容缓
2022年9月14-2022年9月15日Google中国开发者大会在上海举办大会上演讲嘉宾大约抽出了半个小时时间讲解android13的新特性。这也意味着Android离我们越来越近了。
目前小米VIVO等中国厂商的主流手机已经支持Android了我估计大约年底应该就会有Android13的系统逐渐推送到用户手机上所以适配Android13已经变的非常紧迫了。
官方文档
本身主要是参考谷歌官方文档来写的是对官方文章的一个实践和细化官方文档链接如下
https://developer.android.com/about/versions/13/features#themed-app-icons
我们把Android13的变化主要分为两部分第一部分原来就有的在第二篇章讲解。另外一部分是新增的有可能用得到的放在第三章中去讲解。
所以本文主要分为三大块讲解
1.真机如何升级到Android13
2.Android13有哪些功能的变化以及对应的适配方案
3.Android13有哪些新的功能以及如何使用。
一.真机如何升级Android13
真机我们主要分为两类谷歌pixel和其它品牌手机。
1.1其它品牌
其它品牌手机主要是通过注册开发者版本进行升级的因为不同品牌的手机升级方式不一样这里就不具体讲解了。
目前支持的品牌列表如下
- 华硕
- 联想
- 诺基亚
- 一加
- OPPO
- 真我
- 夏普
- TECNO
- Vivo
- 小米
- 中兴
1.2 Pixel升级
本文主要以Pixel升级Android13为例。
谷歌升级主页链接如下https://developer.android.com/about/versions/13/get
主要分为两种升级方式
1.注册Pixel的Android13 Beta版计划
2.刷写或手动安装系统映像
注册Pixel的Android13 Beta版计划
首先第一种方式需要登陆Google账号然后在官方网页点击注册“注册适用于 Pixel 的 Android 13 Beta 版计划”然后一步步操作就可以。最后点击pixel手机的系统就会提示新版本可更新了。
但是这种方式有几个缺陷首先登陆Google账号需要翻墙。其次同一步手机只能加入一个版本计划加入了android12后必须退出才能加入android13。电脑翻墙还可以通过代理手机翻墙还是蛮麻烦的。安卓11升12时我使用的是这种方式但是12升13搞了好久还是无法解决手机翻墙的问题于是放弃了这种方式。
直接刷写的方式
第二种方式就是直接刷写的方式。pixel的可以直接把chrome浏览器当作刷写工具不需要下载额外的软件这一点还是蛮方便的我最终也是选择的这种方式升级的具体介绍一下这种方式
1手机设置打开开发者模式允许USB调试
2点击 Android刷写工具打开新网页如下图所示
3新打开的网页有一个弹出框这里需要注意是否被浏览器拦截掉点击同意ADB调试。注意这里也需要翻墙的电脑要翻墙
4.识别到手机之后需要在手机上设置为unlock模式才能刷机否则刷不进去的。
5.设置完成后点击install就可以开始刷机了。首先是下载刷机包然后安装。注意此后就不要操作手机了否则会导致刷机失败。
6.刷机成功后如下图所示这时候只要手机上点击按钮进行重启可以了。
升级成功后版本就升级到Android13了。
二.功能变化概览及适配方案
1.通知权限的调整
介绍
Android13中notifcation权限改成了运行时权限。运行时权限的意思不是说运行的时候申请运行完就自动释放而是说这是一个较为危险的权限有可能涉及到用户隐私的权限。
简单来说就是把权限级别升级了申请方式不变流程也不变但是需要申请新的权限老的已申请的通知权限在13版本上无法使用哪怕targetSDK=32也不行。
总结下来分为三种场景
1.应用在系统升级到13之前已经具有通知权限则自动授予新的通知权限POST_NOTIFICATIONS。
2.应用在13上新装targetSDK<33则申请该权限时只会弹一次如果拒绝则此应用失去申请该权限的权利。
3.应用在13上新装targetSDK>=33每次申请该权限时都会弹。如果用户拒绝下一次还可以继续申请。
适配方案
首先targetSdkVersion改为33。
其次manifest中声明相关权限
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
最后代码中判断版本进行相关申请如下
private void checkAndShow() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
NotificationManager manager = getSystemService(NotificationManager.class);
boolean b = manager.areNotificationsEnabled();
if (!b) {
String[] strings = {Manifest.permission.POST_NOTIFICATIONS};
requestPermissions(strings, 0);
return;
}
showNotification();
return;
} else {
//继续执行老版本逻辑
}
}
2.读写SD卡权限的调整
介绍
Android13之前读取SD卡只需要申请一个权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
但是Android13之后这个权限被细化成了三个也就是说这是三个权限需要分别单独去申请了。
适配方案
如果是升级Android13之前就已经具有读写SDK的权限那么升级到13之后自己具有上述三个权限。
如果是升级Android13之后新装的应用并且targetSDK小于33则申请READ_EXTERNAL_STORAGE权限时会自动转化为对上述三个权限的申请权限申请框只一个
如果是升级Android13之后新装的应用并且targetSDK大于等于33则申请READ_EXTERNAL_STORAGE权限时会自动拒绝同理WRITE_EXTERNAL_STORAGE也是一样。必须申请上面三个权限才可以。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
checkPermission.add(Manifest.permission.READ_MEDIA_AUDIO);
checkPermission.add(Manifest.permission.READ_MEDIA_IMAGES);
checkPermission.add(Manifest.permission.READ_MEDIA_VIDEO);
} else {
checkPermission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);//启动
}
4.后台运行限制
13之前应用的service是可以后台正常执行的。在13之后某些情况下比如低电量会限制service的一些后台行为比如限制网络的访问等等。用户进行前台互动操作后则APP可以从受限分区移除。
主要分为三个级别代码和描述如下
private void handleAction() {
UsageStatsManager systemService = getSystemService(UsageStatsManager.class);
int appStandbyBucket = systemService.getAppStandbyBucket();
//1.没有任何限制
if (appStandbyBucket <= UsageStatsManager.STANDBY_BUCKET_ACTIVE) {
return;
}
//2.应用最近几个小时内使用过受到一定限制限制程度较低。此时定时任务会被禁止执行
if (appStandbyBucket <= UsageStatsManager.STANDBY_BUCKET_WORKING_SET) {
return;
}
//3.和上面一样只不过是几天内使用过。
if (appStandbyBucket <= UsageStatsManager.STANDBY_BUCKET_FREQUENT) {
return;
}
//4.限制访问网络
}
三.新功能使用及使用样例
1.可降级权限
之前权限只有申请没有降级。这次新增了权限降级功能开发者如果之前申请了某个权限但是后续版本不需要了可以主动调用API进行相关的降级处理。
//activity or fragment
List<String> checkPermission = new ArrayList<>();
checkPermission.add(Manifest.permission.READ_MEDIA_AUDIO);
checkPermission.add(Manifest.permission.READ_MEDIA_IMAGES);
checkPermission.add(Manifest.permission.READ_MEDIA_VIDEO);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
this.revokeSelfPermissionsOnKill(checkPermission);
}
2.无需申请权限的相册选择器
我们通过新的API可以直接访问相册而无需申请任何权限并且支持多选功能。
选择单张
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
startActivityForResult(intent, PHOTO_PICKER_REQUEST_CODE);
选择多张
final int maxNumPhotosAndVideos = 10;
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos);
startActivityForResult(intent, PHOTO_PICKER_MULTI_SELECT_REQUEST_CODE);
还可以通过type区分视频还是图片这样以后就不用自己去搞
intent.setType("video/*");
其实和原来的使用方式差别不大但是多了一个选择数量的功能以及不需要申请权限。
3.APP单独设置语言偏好
13之前APP的语言设置都是跟随系统的系统如果设置的是默认应用那么APP也会自动的切换成英语模式。13开始支持应用单独设置优先语言不需要跟着系统语言设定走了。
首先创建支持语言配置文件
然后在AndroidManifest.xml中进行使用配置。
要注意的时locales_config.xml配置中文的话是zh而不是zh-rCH。具体大陆/香港/台湾省语言是没办法选择的。
4.带主题的应用图标
其实就是让桌面快捷图标支持白天黑夜模式但是实际上这个功能有可能不是我们本来设想的那样。这个功能是让某一张单色应用图标支持白天/黑夜模式的切换而不是支持两张不同的图片分别在白天黑夜模式下进行显示所以实际效果并没有那么的理想。
首先我们需要创建一张VectorDrawable类型的资源图片battery.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<group
android:name="rotationGroup"
android:pivotX="10.0"
android:pivotY="10.0"
android:rotation="15.0">
<path
android:name="vect"
android:fillAlpha=".3"
android:fillColor="#FF000000"
android:pathData="M15.67,4H14V2h-4v2H8.33C7.6,4 7,4.6 7,5.33V9h4.93L13,7v2h4V5.33C17,4.6 16.4,4 15.67,4z" />
<path
android:name="draw"
android:fillColor="#FF000000"
android:pathData="M13,12.5h2L11,20v-5.5H9L11.93,9H7v11.67C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33V9h-4v3.5z" />
</group>
</vector>
然后配置主题图标launcher.xml
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/icon_background" />
<foreground android:drawable="@drawable/icon_light" />
<monochrome android:drawable="@drawable/battery" />
</adaptive-icon>
其中monochrome就是那张主题图标最终变化的也是这一张图片。
最后AndroidManifest.xml中进行配置
最终效果图如下
白天模式/黑夜模式
原本图标效果
需要注意的是必须在设置中打开才可以使用该功能
3.附近WI-FI设备的新运行时权限
介绍
扫描附近WI-FI设备时之前需要申请的权限时ACCESS_FINE_LOCATION定位权限这其实是不合适的。Android13修正了这个问题新添加NEARBY_WIFI_DEVICES权限来解决这问题。
这项新权限会影响几个不同的 Wi-Fi 用例包括以下用例
- 查找或连接到附近的设备如打印机或媒体投射设备。通过该工作流您的应用可以完成以下类型的任务
- 通过带外方式例如通过 BLE接收 AP 信息。
- 使用仅限本地使用的热点通过 Wi-Fi 感知和连接功能发现并连接到设备。
- 通过 Wi-Fi 直连发现和连接到设备。
- 发起与已知 SSID例如汽车或智能家居设备的连接。
- 开启仅限本地使用的热点。
- 连接到附近的 Wi-Fi 感知设备。
使用案例
manifest中进行申明
<manifest ...>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="32" />
<application ...>
...
</application>
</manifest>
代码中进行版本判断
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
checkPermission.add(Manifest.permission.NEARBY_WIFI_DEVICES);
}else{
checkPermission.add(Manifest.permission.ACCESS_FINE_LOCATION);
}