天天看点

Android权限小讲1 背景

1 背景

基于android系统的权限管理方式越来越完善, 在android6.0(api23)开始, 用户开始再应用运行时授予权限,而不是在应用安装是授予。

android是一个权限分割的操作系统, 每个应用都运行在分隔的安全沙箱中, 如果需要该应用访问系统的沙箱数据操作, 首先需要获取到该应用的接口访问权限。

须知

  • 如果应用一味的要求用户授予权限, 可能会让用户感到无所适从, 极有可能会不使用您的应用, 甚至会采用措施直接卸载掉。
  • android对权限进行了分组, 大致分为 正常权限和危险权限, 详情可点击阅读。

权限等级

正常权限不会给用户隐私带来风险,在应用的清单文件中声明使用, 如果声明该应用即可被直接赋予权限使用。

危险权限会授予应用访问用户机密数据的权限。 危险权限在清单文件声明之后, 才有资格在运行时动态的向用户申请。

系统处理权限的差异性

  • 如果你的应用运行在Android5.1或更低版本, 或者运行在SDK 22或更低, 所有权限需要在文件中声明, 安装应用时需要用户明确的授予权限; 如果用户没有授予, 那么根本就不会安装应用。
  • 如果你的应用运行在Android6.0或更高版本, 或者运行在SDK 23或更高, 所有权限需要在文件中声明, 在应用运行时, 需要用户明确的授予该危险权限; 如果用户没有给予该权限, 那么应用仍然可以继续运行除此权限外其余的功能。

检查权限

  • 支持android6.0及以上

    要检查您的应用是否具备该项权限, 可调用

    ContextCompat.checkSelfPermission()

    方法。 例如, 以下示例代表是否具有读取短信功能。

    int state = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS);

    方法将会返回

    PackageManager.PERMISSION_GRANTED

    ,

    PackageManager.PERMISSION_DENIED

如果应用已经具备该权限,则会返回

PERMISSION_GRANTED

, 如果当前并不具备该权限则返回

PERMISSION_DENIED

请求权限

应用可在开发中在清单文件中声明所需要的清单文件, 但是需要用户明确告诉系统该应用是否能够具备, 调用系统的请求权限方法可以显示一个弹出框提供给用户进行选择(这个弹出框开发者不能对他进行自定义)

开发者可以直接在

Activity

中调用

requestPermissions()

方法请求所需权限,请求方法会在异步执行, 并能够通过重写

onActivityResult

方法来得知权限是否被用户授予。

以下代码可以检查应用是否具备读取用户短信的权限,并根据需要请求该权限:

final int PERMISSION_RESULT = ;
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, PERMISSION_RESULT);
        }
           

处理权限请求响应

当用户已对当前请求作出响应时,系统会通过

onRequestPermissionsResult

方法返回请求结果

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode == PERMISSION_RESULT){
            if (grantResults.length >  && grantResults[] == PackageManager.PERMISSION_GRANTED) {
                // 用户响应成功授予
            } else{
                // 用户响应禁止采用该权限
            }
        }
    }
           

如果希望能够更加深入了解android的权限机制, 可参考文档.