Android权限控制EasyPermissions
16lz
2021-01-24
阅读更多
EasyPermissions项目地址 https://github.com/googlesamples/easypermissions
1. 在AndroidManifest定义权限
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, Listperms) { Log.d(TAG, "onPermissionsGranted:" + requestCode + ":" + perms.size()); } @Override public void onPermissionsDenied(int requestCode, List 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(); } }}
- 查看图片附件
更多相关文章
- android - 奔溃日志收集,UncaughtExceptionHandler实现
- android 打开GPS的几种方式
- [掌眼]Android(安卓)WebView Long Press长按保存图片到手机
- Android(安卓)Unparsed aapt error(s)! Check the console for o
- Android(安卓)FragmentManage FragmentTransaction介绍
- Android之类似于黑名单的短信拦截
- Android下载文件提示文件不存在。。。 java.io.FileNotFoundExce
- android中的关闭应用程序进程
- java.lang.RuntimeException: setAudioSource failed异常处理