阅读更多

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, List perms) {        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();        }    }}

 

 

 

 

 

  • 大小: 53.2 KB
  • 查看图片附件

更多相关文章

  1. android - 奔溃日志收集,UncaughtExceptionHandler实现
  2. android 打开GPS的几种方式
  3. [掌眼]Android(安卓)WebView Long Press长按保存图片到手机
  4. Android(安卓)Unparsed aapt error(s)! Check the console for o
  5. Android(安卓)FragmentManage FragmentTransaction介绍
  6. Android之类似于黑名单的短信拦截
  7. Android下载文件提示文件不存在。。。 java.io.FileNotFoundExce
  8. android中的关闭应用程序进程
  9. java.lang.RuntimeException: setAudioSource failed异常处理

随机推荐

  1. Android Donut 系统烧写到开发板,脱离NFS
  2. android autoanswer
  3. Android 设备的位数
  4. android dump 分区
  5. Android弹出窗口的实现(PopupWindow)
  6. Android禁止按键关闭AlertDialog
  7. iPhone 7销量超华为OPPO!iOS中国份额狂涨
  8. Android 快速简单实现夜间模式
  9. android屏幕信息获取的两种方法
  10. Android类参考---Fragment(三)