20181205关于android动态权限管理的总结与思考。

  1、一般来说,在进入app的logo页面时会有权限的检查。如果有,加载进入,如没有则去进行申请(首次进入或者非首次在系统中禁用);

代码参考如下:

 1 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
 2             if ((checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED))
 3                 permissionsList.add(Manifest.permission.READ_PHONE_STATE);
 4             if ((checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED))
 5                 permissionsList.add(Manifest.permission.CAMERA);
 6             if ((checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED))
 7                 permissionsList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
 8             if ((checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED))
 9                 permissionsList.add(Manifest.permission.ACCESS_FINE_LOCATION);
10             if ((checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED))
11                 permissionsList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
12             if (permissionsList.size() == 0) {
13                 init();
14             } else {
15                 requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), REQUEST_PHONE_PERMISSIONS);
16             }
17         } else {
18             init();
19         }

  2、当用户进入app,又跳出去关闭某项 必须功能的权限时:需要在必须开启权限的功能之前进行权限检查,否则某些国产奇葩机型可能出现问题。参考代码如下:

检查:

1 //定位权限检查
2         if (!PermissionUtil.checkPermission(getActivity(), PERM_LOCATION)) {
3             mRootView = showAllowAccess();
4         } else {
5             getBaseData();
6         }

注:此处使用Easypermission框架,由于项目需要定制请求权限管理界面,估此处只应用了权限检查。原生请求权限代码如下:

1 if (Build.VERSION.SDK_INT >= 23 &&
2                 ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
3                 ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
4             ActivityCompat.requestPermissions(this, PERMISSION_STORAGE, 1);
5         }

  3、点击授权和未授权的监听回调中分为两种(目前使用过的):一种是在Activity中重写onRequestPermissionsResult()方法,一种是在通过获取activity下的fragment,将该回调传给fragment(如果必要的话)。

注:此处笔者首先尝试在fragment中进行回调,然后对当前fragment进行刷新,发现并没有实现。写fragment时切记与Activity进行联想。权限管理和其他类似系统级别的管理都要在fragment的父管理Activity中进行控制!

 1     @Override
 2     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 3         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 4         // 获取到Activity下的Fragment
 5 //        List<Fragment> fragments = getSupportFragmentManager().getFragments();
 6 ////        if (fragments == null)
 7 ////        {
 8 ////            return;
 9 ////        }
10 ////        // 查找在Fragment中onRequestPermissionsResult方法并调用
11 ////        for (Fragment fragment : fragments)
12 ////        {
13 ////            if (fragment != null)
14 ////            {
15 ////                // 这里就会调用我们Fragment中的onRequestPermissionsResult方法
16 ////                fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
17 ////            }
18 ////        }
19         if (requestCode == 1 && grantResults[0] == 0) {
20             Log.e(TAG, "onRequestPermissionsResult: 已授权,拉取数据");
21             refreshSearchFragment();
22         } else {
23             Log.e(TAG, "onRequestPermissionsResult: 未授权,不作处理");
24         }
25     }

如果将注解处释放开,则是将回调传到fragment中。需要在fragment中重写onRequestPermissionsResult()。

posted @ 2018-12-05 21:26  anthonyJ  阅读(509)  评论(0编辑  收藏  举报