权限系统1.0

从 Android 6.0 开始,应用程序在安装时候,就不需要用户准许应用程序所需的权限,取而代之的是在用户使用应用程序的过程中,当应用程序所需的功能需要某些权限的时才请求。这样做的好处是 应用程序安装和更新的速度更快

从上面的描述中,我们可以知道,那些特性是在 Android 6.0 之后才出现的,那么 Android 6.0 之前的怎么办呢?当然是保持原状了!

说起来简单,但在实际应用中,其实没有那么简单,因为需要考虑的因素还是有挺多的。有些头脑简单的程序员只是进行简单的分类,从而设计了一些简单的使用场景。当出现问题的时候,他们只是一意孤行的认为那么使用者是脑残或者弱智,他们不知道的是也许是他们的应用程序设计的太粗暴了,他们不明白信息在传递的过程中是会丢失的。基于上面的这些原因,所以有必要简单的聊聊 Android 中的权限系统。

一、权限分类

Android 按照在操作时是否会影响其他应用程序或用户的私人数据,将权限分为了正常权限危险权限

正常权限

应用程序在使用此类权限时并不会对其他应用程序或用户的隐私数据产生影响,例如闪光灯。当应用程序请求此类权限的时,Android 系统会自动授予此类权限。

危险权限

当应用程序访问此类权限时,会对其他应用程序或用户的隐私数据产生影响,例如联系人。当应用程序请求此类的权限的时,必须经过用户的同意。

二、影响因素

在使用应用程序的过程中,影响权限系统不同表现的因素有哪些?

当前设备 Android 系统版本应用程序的目标版本

1.1 当前设备 Android 版本号大于 23

1.1.1 应用程序目标版本大于 23

扫描二维码关注公众号,回复: 2738790 查看本文章

应用程序安装时不需要用户同意权限,应用程序可快速地被安装,且只有在用户使用应用程序并请求所需权限时才提示用户同意相应权限。

1.1.2 应用程序目标版本小于 23

应用程序的表现和上面完全一样,而且尽管应用程序的目标版本低于 23,但是依然可以在“设置”里随时关闭和启用相关权限。

一般情况下,此类情况是不会出现的,因为一个负责人的开发人员会将自己的开发的 Android 版本和最新的 Android 版本相匹配。当然,不免某些有特殊爱好的人不这么做。

1.2 当前设备 Android 版本号小于 23

1.2.1 应用程序目标版本大于 23

由于当前设备的 Android 版本低于 23,所以即使应用程序的目标版本是最新的,但也不能应用最新的 Android 新特性,因为上下文不符合条件

既然这样,那为什么还要这样做呢?因为有些设备的 Android 系统版本号大于 23,当应用程序在此类设备上运行时,还是可以应用最新特性的。

1.2.2 应用程序目标版本小于 23

应用程序的表现和上面完全一样。

三、如何使用?(Android 6.0及以上)

Android 6.0 系统的使用主要分两步:

  1. 检查权限
  2. 请求权限

1.检查权限

在需要使用权限的位置,先检查应用程序是否已经拥有该权限,如果没有,就请求;如果有,则进行后续的操作。

if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED) {
    //没有所需的权限,进行相应处理
}else{
    //拥有相关权限,进行相应处理
}

2.请求权限

在新的权限系统中,大的权限被分成了小粒度的权限,因此用户对权限的控制更加自由了。但凡事均有两面,这样做的坏处是如果你的应用程序在被使用的过程中频繁地请求权限,就会让用户感觉很烦躁,这样导致的最终结果可能是用户直接就把你的应用程序卸载了。

那问题来了,面对这样的系统,我们该如何请求权限呢?

下面是我的一些总结:

1.首先,检查应用程序是否拥有相关权限。第一次运行我们的应用程序,当然不可能拥有所需权限了。因此,接下来要做的就是请求相关权限;
2.其次,请求权限。请求完权限之后,会出现两种情况,第一种用户同意了你的请求,万事大吉,你好我也好。(接下来,想干什么,你随便。)另一种情况是用户拒绝了你的请求,此时就蛋疼了,干什么都觉得尴尬。这个时候,接下来还会出现两种情况,第一种是用户在拒绝你的时候,选了对话框中的“不要再问”选项,这样之后,就真的尴尬了,因为即使你再请求权限,系统也都断然拒绝了;另一种情况是用户只是简单的拒绝了你,但并没有选择“不再询问”,之后当你再点击的时候,系统还会弹出对话框让用户重新选择。出现第二种情况的原因可能是用户不了解为什么应用程序需要这个权限,但又想用这个功能,这个时候,你要做的就是向用户解释为什么在这里应用程序需要这个权限。
3.处理用户选择的结果。应用程序请求完权限之后,会弹出一个对话框让用户选择是否同意,用户选择完之后,我们怎么知道用户选择了什么呢?当然是在相应的回调函数里进行相关的处理:

// 请求联系人权限
private void readContactPermission(){

    // 检查应用程序是否拥有访问联系人权限
    if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED) {

        // 当用户第二次请求相同权限时,先解释,然后再进行请求
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_CONTACTS)) {

            Toast.makeText(this, "Explanation……", Toast.LENGTH_SHORT).show();

            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS}, PERMISSION_REQUEST_1);
        } else {

            // 首次进入,应用程序没有相关权限,直接请求
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS}, PERMISSION_REQUEST_1);

        }
    }else{
        // 应用程序拥有相关权限,进行相应处理
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_1: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // 用户同意了权限请求
            } else {

                // 用户拒绝了权限请求
            }
            break;
        }
    }
}

四、其他注意事项

其实在使用新的权限系统时最大的问题就是权限请求过多,如果再遇上一个不负责任的程序员,那完了,用户肯定骂娘了,所以在开发的时候一定要合理的处理权限的次数和时机。

以下是我的总结:

1.如果不是应用程序必须功能,尽量使用 Intent 代替直接发送权限请求;
2.应用程序首次启动时,只申请首要且显而易见的权限,例如,* 美图软件,首次启动时直接申请拍照权限,用户肯定直接同意了,但 *词典,首次启动直接申请拍照权限,用户可能直接懵逼了,所以一些无关紧要且并不是显而易见的权限在使用到的时候再发请求比较合适;
3.同一个权限第二次请求之前,先进行简短的解释,再请求。

猜你喜欢

转载自blog.csdn.net/zjh_1110120/article/details/72454354