上一篇谈了Android 隐藏的权限管理机制 AppOps,本文将就 Android M 6.0 之后引入的动态权限管理 Android Runtime Permission 展开讨论,Android 运行时权限管理也是基于 AppOps 开发的。
Android M 之前,应用的权限请求是在安装时提示,确认后权限就会拥有。但从 Android M 6.0(API level 23)开始,用户对应用权限进行授权是发生在应用运行时,而不是在安装时。这样可以让用户在安装时节省时间,而且可以更方便的控制应用的权限(至少权限管理不需要 root 了)。用户可以按照对应用的需求来控制应用的权限,比如百度地图的联系人权限。同时用户也可以在应用程序设置中撤销对应用的权限授权。
Android 系统中的权限被划分为两类:普通权限和敏感权限。
普通权限不会涉及到用户隐私,如果应用在 manifest 文件中直接声明了普通权限,系统会自动授予权限给应用。比如:网络INTERNET、蓝牙 BLUETOOTH、震动 VIBRATE 等权限。
敏感权限则要获取到一些用户私密的信息。如果你的应用需要获取敏感权限,首先需要获取用户的授权。比如:相机 CAMERA、联系人 CONTACTS、存储设备 STORAGE。
Android 详细的权限信息可以在此处查找 https://developer.android.com/reference/android/Manifest.permission.html,每个权限里面可能会有 Protection level,标记着是 dangerous 还是 normal。
在 Android 中普通权限和敏感权限,都需要在 manifest 文件中进行权限声明。然而,在不同版本的操作系统或不同的 target SDK level 中的结果是不同的。如果设备运行 Android 5.1 或者更低版本的操作系统,或者你的目标 SDK 版本号小于或等于 22,当你在 manifest 文件中请求了一些权限,用户必须在安装过程时授予全部权限,否则应用不能正常安装。如果设备运行在 Android 6.0 或者更高版本,并且目标 SDK 版本号大于或等于23,应用程序必须要在 manifest 文件中声明需要的权限,当程序运行时,它必须向用户请求授权每个所需的敏感权限。用户可以允许或拒绝授权请求,此时程序可以依赖用户已经授权的权限继续运行。例如:假设你的 app 需要定位和拍照权限,在请求权限时用户只授予了定位权限,那么当前程序可以正常运行并获取定位信息,但是无法进行拍照。
Protection le