Android6.0的运行时权限细节就不赘述了,详细可见文末参考资料的第2篇,详细讲解下于此相关的三个api(个人理解)。
ContextCompat.checkSelfPermission()//检查权限
ActivityCompat.requestPermissions()//请求权限
onRequestPermissionsResult()//回调函数
1. checkSelfPermission
函数定义:
该函数返回一个int,如果返回的整形值等于PackageManager.PERMISSION_GRANTED说明已经拥有改权限,如果返回值等于PackageManager.PERMISSION_DENIED说明没有拥有权限。
注:PackageManager.PERMISSION_GRANTED和PackageManager.PERMISSION_DENIED是PackageManager的两个int常量,专门用于表示是否拥有权限。
2.requestPermissions
第一步检查权限的结果如果是PackageManager.PERMISSION_GRANTED,那么该干嘛干嘛去,因为你已经拥有改权限(例如使用摄像头),如果检查结果是PackageManager.PERMISSION_DENIED,那么就要申请到权限才能干你想干的。
函数定义:
void requestPermissions (Activity activity,
String[] permissions,
int requestCode)
主要说明该函数的三个参数(最让我难以理解的是第三个参数)
1.activity
activity就是要申请权限的activity,写this就可以。
2.permissions
这是一个String数组,该数组包含我们要申请的权限列表,比如要申请的权限有:Manifest.permission.READ_CONTACTS等好几个,就把这些权限(String)添加到该数组中。
注:这说明可以批量申请权限
3.requestCode
这是一个int,是程序猿自定义的一个参数,用法如下:
private static final int REQUEST_PERMISSION_CAMERA_CODE = 1;
requestPermissions( this,
new String[]{Manifest.permission.CAMERA},
REQUEST_PERMISSION_CAMERA_CODE);
那么该参数有何用呢?请看第三个函数onRequestPermissionsResult。
3.onRequestPermissionsResult
第二个函数(requestPermissions)执行完之后,会回调onRequestPermissionsResult,把请求结果告诉请求者,成或者不成总得有个说法不是!程序猿需要重写这个方法,对不同的结果执行不同的对策。
@Override
public void onRequestPermissionsResult( int requestCode,
String permissions[],
int[] grantResults)
{
switch (requestCode) {
//仔细看英文注释,这是官方文档的例子,注释写的很好
case REQUEST_PERMISSION_CAMERA_CODE: {
// 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
}
}
注意case之后的代码,这就是我们之前定义的那个常量,对了,他的作用就是定位你申请的是那个权限,前面也说了,可以一次申请多个权限,那么怎么对应我们申请的权限和申请结果呢?就靠这个int常量了。
参考资料(绝对干货):
http://blog.csdn.net/lmj623565791/article/details/50709663
https://developer.android.com/training/permissions/requesting.html?hl=zh-cn#perm-request