安卓权限背景(引自官网):
安装到设备后,每个 Android 应用都运行在自己的安全沙箱内:
Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户;
默认情况下,系统会为每个应用分配一个唯一的 Linux 用户 ID(该 ID 仅由系统使用,应用并不知晓)。系统为应用中的所有文件设置权限,使得只有分配给该应用的用户 ID 才能访问这些文件;
每个进程都具有自己的虚拟机 (VM),因此应用代码是在与其他应用隔离的环境中运行;
默认情况下,每个应用都在其自己的 Linux 进程内运行。Android 会在需要执行任何应用组件时启动该进程,然后在不再需要该进程或系统必须为其他应用恢复内存时关闭该进程。
由此可见,默认情况下,每个应用只能访问自己沙箱内的文件信息,而无法访问其它文件,由此保护各自应用以及系统的信息安全。
但总有些应用是需要与其它应用共享信息或者需要访问系统服务的,对此,安卓提供了两种方案:
1)、安排两个应用共享一个Linux用户ID,这样它们的文件权限就一致了。如果想要节省系统资源,可以让相同Linux用户ID的应用在一个Linux进程中运行,并共享同一VM(应用需用相同的证书签署);
2)、权限申请,应用可以请求访问设备数据(联系人、短信、SD卡、相机、蓝牙等)的权限。用户可以看到这些权限的申请并管理部分权限。
安卓权限分类:
安卓权限分为两类,正常权限和危险权限,两者都需要在配置文件中明确声明,但根据设备的系统版本和应用的目标SDK有不同的表现方式。
1、正常权限
正常权限不会有侵犯到用户隐私的风险,对于这种权限,只要在AndroidManifest.xml中声明了,系统会自动授予,用户可以在应用信息中看到这些权限,但无法进行管理。
2、危险权限
危险权限是指访问用户机密数据的权限,只有用户明确批准了该类权限,应用才能正常访问相应的数据。
对于此类权限,在系统版本为5.1或更低版本的设备上,或应用的目标SDK <= 22时,用户在安装时需进行权限授予,若不授予,则系统不会安装此app;而当设备系统为6.0及以上,或应用的目标SKD为23及更高时,应用不仅需在配置文件中声明权限,在运行时也应进行权限请求,用户可以明确地同意/拒绝此类权限请求,不影响其它功能运行。
检查权限(以在日历中写入的权限检查为例):
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR)
若应用拥有权限,则permissionCheck的值应为PackageManager.PERMISSION_GRANTED,且应用可以继续操作。如果应用不具有权限,则值为PERMISSION_DEMIED,应用需明确向用户要求权限。
权限请求:
权限请求方法会异步运行:立即返回并在用户响应对话框之后,系统会调用应用的回调方法并将结果传入,代码实例(以检查读取用户联系人的权限为例
权限请求响应:
权限组:
当进行权限组请求时,对话框会说明权限组信息,但不会一一列出权限,如请求READ_CONTACTS和WRITE_CONTACTS时,对话框会显示应用需要访问设备的联系人。当权限组中的一项被授予了权限时,其它权限项会被同时默认授予,当请求其它权限时,系统会自动调用回调传入PERMISSION_GRANTED,如果用户之前授予过权限,下回也会采用同样的方式处理。(官方仍建议在权限请求时明确每一项权限,而不是依赖权限组的权限共享性偷懒)
网友评论