EasyPermissions 是谷歌官方提供的动态权限申请库。
分成如下几个步骤:
1)检测权限
2)请求权限
3)响应请求结果
4)处理被拒绝的情况(进入到申请页面)
整个的思路:
检测权限 - 具备权限 - 直接调用方法
检测权限 - 不具备权限 - 申请权限 - 授权成功 / 授权失败
第一步:我们点击打电话的按钮,开始进行动态权限的检测
this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(EasyPermissions.hasPermissions(MainActivity.this, Manifest.permission.CALL_PHONE)){ //具备权限 直接进行操作 showToast("具备权限 直接进行操作"); }else { //权限拒绝 申请权限 showToast("权限拒绝 申请权限"); /** * 第一个参数:Context对象 * 第二个参数:权限弹窗上的文字提示语。告诉用户,这个权限用途。 * 第三个参数:这次请求权限的唯一标示,code。 * 第四个参数 : 一些系列的权限。 */ EasyPermissions.requestPermissions(MainActivity.this, "打电话",1,Manifest.permission.CALL_PHONE); } } });
第二步:如果权限检测的结果是拒绝的,那么我们就申请权限。使用了requestPermissons()方法,当这个方法的返回后,我们调用了onRequestPermissionsResult()的回调,如下:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // 将结果转发到EasyPermissions /** * * @param requestCode 请求的code * @param permissions 一些列的请求权限 * @param grantResults 用户授权的结果 * @param receivers 监听的上下文,处理回调 */ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, MainActivity.this); }
第三步:请求权限后,用户可能同意,也可能不同意。这样就根据回调来处理两种情况
/** * 请求权限成功。 * 可以弹窗显示结果,也可执行具体需要的逻辑操作 * @param requestCode * @param perms */ @Override public void onPermissionsGranted(int requestCode, List<String> perms) { showToast( "用户授权成功"); } /** * 处理权限被拒的情况 * @param requestCode * @param perms */ @Override public void onPermissionsDenied(int requestCode, List<String> perms) { showToast( "用户授权失败"); /** * 若是在权限弹窗中,用户勾选了'NEVER ASK AGAIN.'或者'不在提示',且拒绝权限。 * 这时候,需要跳转到设置界面去,让用户手动开启。 */ if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { new AppSettingsDialog.Builder(this).setTitle("标题").setRationale("请申请权限").build().show(); } }
当授权失败以后,用户如果还需要使用的时候,我们就通过AppSettingDialog类来手动的让用户进行授权。
备注:
插件库:
implementation 'pub.devrel:easypermissions:0.4.0'
同时记着在注册文件中也添加该权限。
<uses-permission android:name="android.permission.CALL_PHONE" />