Android 6.0中增加了 运行时permissions,就是说可以在运行时判断有无权限和获取权限,让用户同意即可。

在之前的版本都是安装的时候就会要用户同意各种权限,现在是在用的时候,回去问用户同意。

下面介绍一下我们应用在适配6.0的时候,需要做哪些事情吧,

权限添加

这个和之前的做法没有区别:在AndroidManifest中添加

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.snazzyapp">

    <uses-permission android:name="android.permission.SEND_SMS"/>
    

    <application ...>
        ...
    </application>

</manifest>

在你声明权限之后,系统的行为取决于你权限的敏感程度,如果这个权限没有影响到用户隐私,系统会自动同意你的权限,如果权限可能影响用户隐私,那系统就会去征询用户的同意了,


检查权限

如果你需要一个危险的权限,就必须每次都检查你是否已经有权限了,所以如果有权限了,我们直接使用就可以了,如果没有那么就申请就好了

int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
        Manifest.permission.WRITE_CALENDAR);

返回值就是是否已经有权限了,如果返回值是

PackageManager.PERMISSION_GRANTED,就证明有权限了,如果返回

PackageManager.

PERMISSION_DENIED,那就证明还没有权限呢,

这是我们就要自己去申请


申请权限

ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

调用这个方法之后,会弹出一个标准的dialog,这个是不能被我们自定义的啊,长啥死样就看各个厂商了。

但是呢,我们可以在弹框之前,单独弹一个窗口,来告诉为什么要申请权限,然后再去弹这个系统框,这样用户就会更加了解你为什么需要这个权限了。

所以我们的完整代码如下:

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}



上面的大多数方法,我们都已经讲过了,根据注释,也理解了每一段都干了什么,

唯一需要额外说一下的是

ActivityCompat.shouldShowRequestPermissionRationale()
  • 如果我们的应用在之前请求过权限,但是用户拒绝了我们的请求,返回true
  • 如果用户在之前关闭了权限,并且在请求对弹框时,选择了 Don't ask again 选项,返回false
  • 如果设备方针拒绝这个应用拥有这个权限,返回false

上面是google说的几点,下面我再解释成人话,就是说:


我们第一次调用这里,肯定是返回false的,就会弹出来系统弹框,问你同不同意啊,


如果你同意了,以后就没这里什么事了


如果要是不同意呢,以后就会返回true,


那咱们就得弹个框,告诉用户问什么要权限,最好再有个同意按钮