Android权限控制EasyPermissions

EasyPermissions项目地址 https://github.com/googlesamples/easypermissions

1. 在AndroidManifest定义权限

<uses-permission android:name="android.permission.CAMERA" />

2. 在需要权限的方法前添加注解 @AfterPermissionGranted   ,该注解需要传入requestCode,用于区分请求

@AfterPermissionGranted(200)
void reqScanCamera() {
    String[] perms = {Manifest.permission.CAMERA};
    if (EasyPermissions.hasPermissions(this, perms)) {
        // 如果拥有权限
    } else {
        // 如果没有权限
        EasyPermissions.requestPermissions(this, "您必须授权开启摄像头权限,才能进行下一步操作", 200, perms);
    }
}

EasyPermissions.requestPermissions 第二个参数的作用:

当用户第一次拒绝后,第二次再请求权限时,弹出对话框,提示用户请求权限的原因,用户点击确定后,会自动弹出权限的系统请求。



 

但坑爹的是,各大手机厂商的定制系统对该逻辑进行了一定的改动,例如红米Note4的MIUI系统当用户首次选择拒绝权限之后就会“不再询问”了,华为EMUI系统在首次弹出权限请求时就会提供“不再询问”的选项。此时就需要判断APP的某个权限是否处于“不再询问”的状态,从而引导用户去APP设置里面开启权限。

判断方法是 EasyPermissions.somePermissionPermanentlyDenied

但是务必注意,该方法一定要在得知权限被拒之后执行,原因是该方法就是在判断是否应该出现上方的图片提示,如果权限被拒绝了,同时不允许出现上方的图片提示,则认为该权限的状态就是“不再询问”

综上,通过如下第三点,处理不再询问的权限

3. 实现 EasyPermissions.PermissionCallbacks,定义权限被拒和允许时的操作,和判断“不再询问”状态

public class FaceIDFontActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
    // ... some other code ...

    @Override
    public void onPermissionsGranted(int requestCode, List<String> perms) {
        Log.d(TAG, "onPermissionsGranted:" + requestCode + ":" + perms.size());
    }

    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
        Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size());

        // (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN."
        // This will display a dialog directing them to enable the permission in app settings.
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
            new AlertDialog.Builder(this)
                    .setTitle("权限提示")
                    .setMessage("本项认证需要摄像头权限,点击确认后在新页面滑动到最下方,在权限管理处,开启相机权限")
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                        }
                    })
                    .setPositiveButton("确认", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // 跳转到APP设置页面
                            Intent intent = new Intent();
                            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                            Uri uri = Uri.fromParts("package", getPackageName(), null);
                            intent.setData(uri);
                            startActivity(intent);
                        }
                    })
                    .create().show();
        }

    }
}

猜你喜欢

转载自xuanzhui.iteye.com/blog/2400850