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
}
}
}