Android 6.0 的发布已经将近一年了,其中引入了一个比较重要的新特性:单个应用的权限可以被管理了,用户可以开启或关闭一个应用的任意一个权限。这就需要我们对这个特性进行适配。
通过查看 Google 官网的教程 Requesting Permissions at Run Time ,可以快速的了解进行权限申请,以及权限申请的处理方法。
权限申请
这里贴出请求权限的方法,在需要权限的地方:
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
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 {
// No explanation needed, we can request the permission.
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.
}
}
这里的代码大部分都很好理解,首先通过 ContextCompat.checkSelfPermission
方法判断是否拥有某个权限,然后通过 ActivityCompat.shouldShowRequestPermissionRationale
方法判断是否需要显示请求权限解释,最后通过 ActivityCompat.requestPermissions
方法显示权限对话框让用户选择是否允许使用该权限。
这里 ActivityCompat.shouldShowRequestPermissionRationale
方法一开始我是比较疑惑的,经过查资料和实际操作发现有以下几种情况:
- 当首次询问用户是否允许权限时,返回 false ;
- 当用户拒绝过一次权限时,返回 true ,此时需要解释该权限的作用;
- 当用户选择不再显示该对话框,并拒绝时,返回 false ,同时对话框也不再显示。
回调处理
接下来需要处理用户选择的结果,activity通过实现 ActivityCompat.OnRequestPermissionsResultCallback
接口,重写 onRequestPermissionsResult
方法。
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
这里写一下在实际使用过程中我遇到的坑,在 Google 的教程是适用于 activity 的,在 fragment 中使用时,我发现上述方法并没有得到回调,解决方法是在 fragment 中直接使用 fragment 的 requestPermissions
方法取代 ActivityCompat.requestPermissions
来显示对话框,并重写 fragment 中的 onRequestPermissionsResult
方法,其他与上述一致。值得注意的是,只要调用了 requestPermission 之后,不论用户是允许,拒绝还是不在显示,该方法都会被回调。
内容很简单,只要是讲了使用中遇到的一些问题,在以后可能使用中可以得到避免,毕竟 6.0 的占有率会一直上升,6.0 权限的适配是需要做的。
危险权限的列表和分组,还有完整的官方demo都在参考链接中。
网友评论