Ответ 1
Сначала вам нужно реализовать OnRequestPermissionsResultCallback
Listener
класса ActivityCompat
в Activity
и переопределить метод void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
, чтобы проверить, разрешает или запрещает ли пользователь разрешение
Вы можете сделать это. Здесь я проверяю доступ к разрешениям для WRITE_EXTERNAL_STORAGE
:
int REQUEST_STORAGE = 1;
private void checkPermissions() {
if (hasStoragePermissionGranted()) {
// you can do whatever you want
} else {
requestPermission();
}
}
public boolean hasPermissionGranted(){
return ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}
public void requestPermission() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_STORAGE);
}
}
Здесь onRequestPermissionsResult()
будет вызываться метод, когда пользователь разрешает или запрещает разрешение на разрешение из окна Runtime.
Вы также можете справиться с ситуацией, когда пользователь установил флажок никогда не показывать диалоговое окно Runtime Permission, для которого вы можете показать Snackbar или кнопку, чтобы перенаправить пользователя на страницу настроек вашего приложения, так как вы не можете отобразить диалоговое окно с разрешением после того, как пользователь проверил "Never ask again"
.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == REQUEST_STORAGE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Storage permission is enabled
canSendAttachments = true;
systemLogsCheckbox.setEnabled(true);
} else if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivtity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//User has deny from permission dialog
Snackbar.make(mainLayout, getResources().getString("Please enable storage permission"),
Snackbar.LENGTH_INDEFINITE)
.setAction("OK", new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_STORAGE);
}
})
.show();
} else {
// User has deny permission and checked never show permission dialog so you can redirect to Application settings page
Snackbar.make(mainLayout, getResources().getString("Please enable permission from settings"),
Snackbar.LENGTH_INDEFINITE)
.setAction("OK", new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", MainActivity.this.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
})
.show();
}
}
}
Здесь я использовал Snackbar
, чтобы показать релевантное сообщение пользователю о Разрешении, а mainLayout
- id от Activity Main Layout
.
Надеюсь, это поможет вам.