Backlight87
8/24/2017 - 5:29 PM

6.0动态权限申请

6.0动态权限申请

在Activity申请权限

在我们需要的地方授予权限

//判断checkSelfPermission是否包含WRITE_EXTERNAL_STORAGE权限(有的话会返回0),PackageManager.PERMISSION_GRANTED的值是0,代表有包含。




//Read_EXTERNAL_STORAGE_REQUEST_CODE是一个自定义的任意大于0的数字,后面会用到
int Read_EXTERNAL_STORAGE_REQUEST_CODE = 1;
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
              != PackageManager.PERMISSION_GRANTED) {
          //申请Read_EXTERNAL_STORAGE权限
          ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                  Read_EXTERNAL_STORAGE_REQUEST_CODE);
      }
      
      
      
如果我们要完善一点,需要对用户拒绝授权的操作进行捕获操作

//用户选择允许或拒绝后,会回调onRequestPermissionsResult方法, 该方法类似于onActivityResult



  @Override
  public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      doNext(requestCode,grantResults);
  }
  
  
  
//我们接着需要根据requestCode和grantResults(授权结果)做相应的后续处理
//这里的requestCode就是我们上面自定义的Read_EXTERNAL_STORAGE_REQUEST_CODE的值,这里来判断是哪个权限的回调



private void doNext(int requestCode, int[] grantResults) {
      if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
          if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
              // Permission Granted
          } else {
              // Permission Denied
          }
      }
  }
 
 
 ================================================================================================
在Fragment中申请权限

/*
* Fragment中运行时权限的特殊处理
 
在Fragment中申请权限,不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法,否则会回调到Activity的onRequestPermissionsResult
 
如果在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方法,onRequestPermissionsResult不会回调回来,建议使用getParentFragment().requestPermissions方法,
这个方法会回调到父Fragment中的onRequestPermissionsResult,加入以下代码可以把回调透传到子Fragment
*/
 
  @Override
  public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      List<Fragment> fragments = getChildFragmentManager().getFragments();
      if (fragments != null) {
          for (Fragment fragment : fragments) {
              if (fragment != null) {
                  fragment.onRequestPermissionsResult(requestCode,permissions,grantResults);
              }
          }
      }
  }