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()。