1. 检查是否获得权限
ContextCompat.checkSelfPermission(context, String permission);
如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED
,并且应用可以继续操作。如果应用不具有此权限,方法将返回 PackageManager.PERMISSION_DENIED
。permission
是Manifest.permission.READ_CALL_LOG
,Manifest.permission.READ_PHONE_STATE
之类的权限值。
2. 申请权限
权限编号在申请结果的回调函数中回传,用于分辨申请的权限,该方法为非阻塞方法。
ActivityCompat.requestPermissions(context, String[] 权限数组, 自定义权限编号);
回调函数如下,需在context指定的Activity中实现,requestCode
为之前传入的自定义权限编号,permissions
为权限,grandResult
数组储存每个权限的授权结果, 其值的范围和含义同上述checkSelfPermission
的返回值(PackageManager.PERMISSION_GRANTED
,PackageManager.PERMISSION_DENIED
)
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {}
注意:如果试图动态申请的权限没有在AndroidManifest.xml
声明将导致弹出的权限申请窗口闪退。
示例:
//检查和申请权限
private void requestPermission(){
//把需要检查的一组权限放在一个字符串数组里
String[] permissions = new String[]{Manifest.permission.READ_CALL_LOG, Manifest.permission.READ_PHONE_STATE};
//记录没有获得的权限数量
int noPermission = 0;
//检查权限
for(String permission : permissions){
if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
this.phone_granted = false;
noPermission++;
}
}
//申请未获得的权限(直接把权限组传入)
if(noPermission != 0){
ActivityCompat.requestPermissions(this, permissions, MainActivity.PEMISSION_PHONE);
}
}
//申请结果回调函数
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//调用父类方法
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//根据requestCode处理申请结果
switch (requestCode){
case MainActivity.PEMISSION_PHONE:
//这里使用了一个变量保存权限获取情况,该变量会被之后的初始化代码用于检查权限
this.phone_granted = true;
for(int result : grantResults){
if (result != PackageManager.PERMISSION_GRANTED) {
//权限组中有权限没有获取,初始化就无法进行,因此把授权情况设置为false
this.phone_granted = false;
break;
}
}
}
//尝试初始化权限相关的代码
initPermissionRelatedTask();
}