Android8.0适配方案

准备工作

 

将我们项目中的targetSdkVersion改为 26(8.0) 或者 27(8.1)

1运行时权限

 

首先引用官方的原文。

https://developer.android.google.cn/about/versions/oreo/android-8.0-changes#rmp

 

在 Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。 
对于针对 Android 8.0 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。 


例如,假设某个应用在其清单中列出 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE。应用请求 READ_EXTERNAL_STORAGE,并且用户授予了该权限。如果该应用针对的是 API 级别 24 或更低级别,系统还会同时授予 WRITE_EXTERNAL_STORAGE,因为该权限也属于同一 STORAGE 权限组并且也在清单中注册过。如果该应用针对的是 Android 8.0,则系统此时仅会授予 READ_EXTERNAL_STORAGE;不过,如果该应用后来又请求 WRITE_EXTERNAL_STORAGE,则系统会立即授予该权限,而不会提示用户。

 

所谓权限组如下: 
这里写图片描述

 

 

所以总结下来,如果你之前是用什么权限就去申请什么权限,那么恭喜你,这个变化不会影响到你。

 

如果你只申请了权限组中的某些权限,却用了同组的其他权限,那么你就需要去适配一下了。

 

那么怎么适配呢,如果你去检查之前每个申请权限的地方,未免太过麻烦。那么你可以根据你项目中的Manifest文件中需要的权限与权限组去对比,整理出你需要申请的各个权限组。比如你需要android.permission.CALL_PHONE(打电话)与android.permission.READ_PHONE_STATE(读取手机状态) 这两个权限。那么你就整理出了类似下面的类。

 

public class PermissionGroup {

     //Phone权限
     public static String[] PHONE = new String[] {
          Manifest.permission.READ_PHONE_STATE, 
          Manifest.permission.CALL_PHONE
     };

     ...
}

 

到时在申请权限时就可以直接获取它,一次将它们都申请了。这样就防止了遗漏某个权限,导致的异常。

 

2通知适配

ps:也可以参考https://mp.weixin.qq.com/s/Ez-G_9hzUCOjU8rRnsW8SA

其实8.0在通知这里变化还挺多的,比如通知渠道、通知标志、通知超时、背景颜色的等,详细的说明可以去看官方的Android 8.0 功能和 API。

 

虽然变化很多,但是国内的机子貌似支持的不多。。。我在小米的文档中了解到,Android 已将通知渠道的逻辑纳入 Android Compatibility Definition Document (CDD) 中,意味着所有 Android 厂商都必须支持。所以我们可以放心的去适配。

 

这里写图片描述

 

通知渠道:Android 8.0 引入了通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。

 

我个人很喜欢这个新特性。也就是说,我们可以将我们给用户的通知进行分类,我用高德地图app来举例,从左到右分别是小米(MIUI10)、华为(EMUI 8.1.0)、一加(氢OS 5.1):

 

 

 

可以看到高德地图分的很细致,分为四个组共13个类别(华为貌似对组不生效)。这样有个好处,我们可以控制我们想收到的通知,比如我不喜欢运营活动通知,那我就可以把它关闭。

 

这样避免大量的不必要通知,否则使得用户觉得烦,一棒子打死。直接关闭你的允许通知。当然了,大量app都还没有适配,适配的也都分的不是很细致,比如下图的QQ。(没有对比就没有伤害)

 

 

 

当然更重要的问题是,如果不去适配,可能通知都不会弹出来