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,
那咱们就得弹个框,告诉用户问什么要权限,最好再有个同意按钮