Проверяет ли флажок Никогда не спрашивать снова при запросе разрешения во время выполнения отключить будущие диалоги?

Если пользователь отказывает в разрешении во время выполнения, но никогда не запрашивает его снова , отключает ли он любую будущую способность запрашивать одно и то же разрешение? Должен ли пользователь проходить настройки, чтобы разрешить это разрешение?

В моем приложении, когда я звоню

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 0)

И это разрешение ранее было отклонено с помощью параметра « Никогда не запрашивать снова» , он вообще не отображает диалоговое окно. Это ожидаемое поведение?

Solutions Collecting From Web of "Проверяет ли флажок Никогда не спрашивать снова при запросе разрешения во время выполнения отключить будущие диалоги?"

Это ожидаемое поведение.

Из документации :

Когда система просит пользователя предоставить разрешение, у пользователя есть возможность сообщить системе не запрашивать это разрешение снова . В этом случае, в любое время, когда приложение использует requestPermissions() для повторного запроса этого разрешения, система немедленно отклоняет запрос . Система вызывает ваш onRequestPermissionsResult() обратного вызова onRequestPermissionsResult() и передает PERMISSION_DENIED , так же, как если бы пользователь явно отклонил ваш запрос еще раз. Это означает, что когда вы вызываете requestPermissions() , вы не можете предположить, что произошло какое-либо прямое взаимодействие с пользователем.

Да, он отключится. Но вы можете сделать что-то, чтобы определить, установил ли пользователь некоторые разрешения не запрашивать снова . Вы можете проверить его в onRequestPermissionsResult()

 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { for(String permission: permissions){ if(ActivityCompat.shouldShowRequestPermissionRationale(this, permission)){ //denied Log.e("denied", permission); }else{ if(ActivityCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED){ //allowed Log.e("allowed", permission); } else{ //set to never ask again Log.e("set to never ask again", permission); //do something here. } } } } 

Я подготовил вспомогательную библиотеку для разрешения разрешить такое решение здесь, на GitHub.

Да, Джеймс МакКракен, это ожидаемое поведение. И FYI вы не можете открыть диалог разрешения запроса, если пользователь выбрал Never Ask Again. Но вы можете показать информацию пользователю.

 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case REQUEST_CODE: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_SHORT).show(); // do your work here } else if (Build.VERSION.SDK_INT >= 23 && !shouldShowRequestPermissionRationale(permissions[0])) { Toast.makeText(MainActivity.this, "Go to Settings and Grant the permission to use this feature.", Toast.LENGTH_SHORT).show(); // User selected the Never Ask Again Option } else { Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show(); } break; } } 

И если вы хотите открыть экран настроек после того, как пользователь выбрал вариант «Никогда не спрашивать снова», используйте ниже код

 Intent i = new Intent(); i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); i.addCategory(Intent.CATEGORY_DEFAULT); i.setData(Uri.parse("package:" + context.getPackageName())); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); context.startActivity(i);