Android M permission request by RxPermission or ContextCompat(ActivityCompat)

1.use RxPermission request storage and location

new RxPermissions(this)
        .requestEach(
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.ACCESS_FINE_LOCATION
                    )
        .subscribe(permission -> {
          if (permission.granted) {
            //has permission
            Logger.e("granted");
          } else if (permission.shouldShowRequestPermissionRationale) {
            //denied permission without ask never again
            Logger.e("show system permission rationale");
          } else {
            //denied permission with ask never again
            // go to setting
            Logger.e("not show go to settings");
            switch (permission.name) {
              case Manifest.permission.ACCESS_FINE_LOCATION:
                Snackbar.make(layout, "Location permission is required to get data for your location", Snackbar.LENGTH_LONG)
                    .setAction("Settings",
                        v -> startActivity(appSystemSettings(getPackageName())))
                    .show();
                break;
              case Manifest.permission.WRITE_EXTERNAL_STORAGE:
                Snackbar.make(layout, "Storage permission is required to save data for your sdcard", Snackbar.LENGTH_LONG)
                    .setAction("Settings",
                        v -> startActivity(appSystemSettings(getPackageName())))
                    .show();
                break;
              default:
                Snackbar.make(layout, "Permission is required to use for this app", Snackbar.LENGTH_LONG)
                    .setAction("Settings",
                        v -> startActivity(appSystemSettings(getPackageName())))
                    .show();
                break;
            }
          }
        });

2.use ContextCompat request permission

private void requestPermissionsByContextCompat() {
    if (hasPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
      Logger.e("granted");
    } else {
      Logger.e("denied");
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        Logger.e("show");
      } else {
        Logger.e("not show");
        Snackbar.make(layout, "STORAGE permission is required to save files for your app", Snackbar.LENGTH_LONG)
            .setAction("Settings",
                v -> startActivity(appSystemSettings(getPackageName())))
            .show();
        return;
      }
      ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
          WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
    }
  }

  public boolean hasPermission(
      @NonNull
          String permission) {
    return
        ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED;
  }

  public static Intent appSystemSettings(String packageName) {
    return new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
        .setData(Uri.parse("package:" + packageName));
  }

  @Override
  public void onRequestPermissionsResult(
      int requestCode,
      @NonNull
          String[] permissions,
      @NonNull
          int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        Logger.e("granted");
        // Permission Granted
      } else {
        Logger.e("denied");
        // Permission Denied
      }
    }
  }

你可能感兴趣的:(Android M permission request by RxPermission or ContextCompat(ActivityCompat))