zoukankan      html  css  js  c++  java
  • 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()。

  • 相关阅读:
    面试C#需要准备的一些基础
    学习jQuery(一),做的第一个可拖动列的Grid
    面试的两道SQL题
    SSIS ODBC方式连接mysql数据库的一个问题
    WIN7下A卡解决部分游戏(CS、CF等)无法全屏问题
    显示Deprecated: Assigning the return value of new by reference is deprecated in解决办法
    Eclipse 中文插件的安装
    安装NASM for Linux
    将Eclipse中文注释字体变大方法
    如何查看局域网内所有IP
  • 原文地址:https://www.cnblogs.com/antble/p/10073530.html
Copyright © 2011-2022 走看看