乐趣区

Android60优雅权限请求封装

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);// 处理结果
}

具体流程如下:

最后

Github:https://github.com/qylost/And…

退出移动版