Android优雅权限请求封装
先来看看不封装的情况下代码是如何写的,这里我们首先要判断是否存在特定的权限,如果存在才能进行特定操作,否则就要请求权限。最后请求的结果只能放在onRequestPermissionsResult中进行处理。这样写有几个不好的地方,第一就是你的判断逻辑是重复的,再者就是一旦有新的权限需要添加那么就需要修改onRequestPermissionsResult中的代码,根据面向对象基本原则中的开闭原则,我们尽量在需求发生改变后添加新的代码而不是修改原有的代码。
//请求权限
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
callPhone();
} else {
//请求权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, CODE_CALL_PHONE);
}
//处理权限回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == CODE_CALL_PHONE && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
callPhone();
}
}
以下就是封装后的权限调用,首先去请求权限,具体的结果会被回调到我们定义好的函数中,其函数需要使用注解进行标识,然后在onRequestPermissionsResult中直接交给我们封装好的PermissionHandler进行处理,它会帮我们完成函数的回调工作,省去了我们判断的逻辑代码。最重要的是不需要写逻辑验证了,也无需修改onRequestPermissionsResult中的内容,所有权限请求会被统一处理。
//请求权限
PermissionHandler.requestPermissions(this, CODE_CALL_PHONE, Manifest.permission.CALL_PHONE);
//---------------------------------------CALL_PHONE权限回调----------------------------
@HandlePermission(type = HandlePermission.SUCCESSFUL, requestCode = CODE_CALL_PHONE)//权限申请成功的回调
public void callPhone() {
Toast.makeText(this, "The request of CALL_PHONE is successful!", Toast.LENGTH_SHORT).show();
}
@HandlePermission(type = HandlePermission.FAILED, requestCode = CODE_CALL_PHONE)//权限申请失败的回调
private void callPhoneFailed() {
Toast.makeText(this, "The request of CALL_PHONE is failed!", Toast.LENGTH_SHORT).show();
}
//-------------------------------------------权限请求回调-------------------------
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionHandler.onRequestPermissionsResult(this, requestCode, permissions, grantResults);//处理结果
}
具体流程如下:
最后