Android 13适配 |
您所在的位置:网站首页 › 安卓13版本 › Android 13适配 |
目录 一. 创建安卓13模拟器或使用安卓13系统真机调试. 1.下载 Android 13 SDK: 2. 设置模拟器 二.功能变化概览及适配方案 1.读写SD卡权限的调整 2.撤销权限 3.通知权限的调整 4.后台运行限制 一. 创建安卓13模拟器或使用安卓13系统真机调试. 1.下载 Android 13 SDK: 依次点击 Tools > SDK Manager。在“SDK Platforms”标签页中,选择 Android 13 (Android API 33)。在 SDK Tools 标签页中,选择 Android SDK Build-Tools 33。点击OK安装 SDK。 2. 设置模拟器 依次点击 Tools > AVD Manager > "+ Create Virtual Device".选择"Phone" > "Next" > 选择 API Level 33 创建模拟器即可. 二.功能变化概览及适配方案 1.读写SD卡权限的调整Android13之前,读取SD卡只需要申请一个权限 但Android13之后,这个权限被细化成了三个,这三个权限需要分别单独去申请。 Manifest.permission.READ_MEDIA_IMAGES Manifest.permission.READ_MEDIA_VIDEO Manifest.permission.READ_MEDIA_AUDIO适配方案: 如果是升级Android13之前就已经具有读写SDK的权限,那么升级到13之后,自动就会有上述三个权限。 如果是升级Android13之后新装的应用,且targetSDK小于33,申请READ_EXTERNAL_STORAGE权限时,会自动转化为对上述三个权限的申请,申请框只一个. 如果是升级Android13之后新装的应用,且targetSDK大于等于33,则申请READ_EXTERNAL_STORAGE权限时会自动拒绝(同理WRITE_EXTERNAL_STORAGE也是一样)。必须申请上面三个权限才可以。下午就是安卓13新安装APP,直接申请读写权限被拒绝. 安卓13动态权限兼容处理,打开相册不需要权限,但选择相片之后的操作需要自行测试是否正常. 1.在AndroidManifest.xml文件中添加权限,根据自己需要添加. 2.发起动态权限申请,根据自身需要添加. String[] list = new String[10]; if (Build.VERSION.SDK_INT >=33){ list[0] = "android.permission.READ_MEDIA_IMAGES"; //图片 list[1] = "android.permission.READ_MEDIA_VIDEO"; //视频 list[2] = "android.permission.READ_MEDIA_AUDIO"; //音频 }else{ list[0] = Manifest.permission.READ_EXTERNAL_STORAGE; } ActivityCompat.requestPermissions(MainActivity.this, list, 000);下面是只申请图片权限的效果: 3.打开相册方法兼容 public static void openPhotoAlbum(Activity activity) { Intent intent; if (Build.VERSION.SDK_INT >= 33) { //安卓13以上打开相册. intent = new Intent("android.provider.action.PICK_IMAGES"); intent.setType("images/*");//设置只显示图片 /** * 设置选择照片的个数,默认1张时可不添加该属性,大于1的时候再设置. * 可指定图片数量上限为最大数字,调用 MediaStore.getPickImagesMaxLimit(). */ //intent.putExtra("android.provider.extra.PICK_IMAGES_MAX", MediaStore.getPickImagesMaxLimit()); } else { intent = new Intent(Intent.ACTION_PICK); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); } activity.startActivityForResult(intent, 888); } 2.撤销权限对不需要使用的权限进行撤销. 现在这张图片是申请了所有读取权限的. 1.在AndroidManifest.xml中删除准备撤销的视频和音频权限. 3.撤销完权限之后再看app的权限,如下图已删除视频和音频权限. Android13中,notifcation权限改成危险权限,需要动态申请。 简单来说,就是把权限级别升级了,申请方式不变,流程也不变,但是需要申请新的权限,老的已申请的通知权限在13版本上无法使用,即使 targetSDK < 33 也不行。 总结下来,分为三种场景: 1.应用在系统升级到13之前已经有通知权限,则自动授予新的通知权 POST_NOTIFICATIONS。 2.应用在13上新装,targetSDK=33,每次申请该权限时都会弹。如果用户拒绝,下一次还可以继续申请。 适配方案: 首先,targetSdkVersion改为33。 其次,manifest中声明相关权限 最后代码中判断版本进行相关申请,如下: private void checkAndSendNotification() { if (Build.VERSION.SDK_INT >= 33) { //检查是否有通知权限 NotificationManager manager = getSystemService(NotificationManager.class); boolean enabled = manager.areNotificationsEnabled(); if (!enabled) { String[] strings = {"android.permission.POST_NOTIFICATIONS"}; requestPermissions(strings, 002); return; } sendNotification(); return; } else { //继续执行老版本逻辑 sendNotification(); } } private void sendNotification() { } 4.后台运行限制安卓13之前,应用的service是可以后台正常执行的。在13之后,某些情况下(比如低电量),会限制service的一些后台行为,比如限制网络的访问等等。用户进行前台互动操作后,则APP可以从受限分区移除。 主要分为三个级别,代码和描述如下: private void handleAction() { UsageStatsManager systemService = getSystemService(UsageStatsManager.class); int appStandbyBucket = systemService.getAppStandbyBucket(); //1.没有任何限制 if (appStandbyBucket checkPermission.add(Manifest.permission.NEARBY_WIFI_DEVICES); }else{ checkPermission.add(Manifest.permission.ACCESS_FINE_LOCATION); } |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |