Я имею дело с разрешениями по требованию в Android, и я обнаружил спорную ситуацию.Моя цель - отобразить диалоговое окно с кнопкой «Перейти к настройкам приложения», если пользователь выбрал «Никогда не спрашивать» в разрешении.
ОК, если пользователь выбрал «Никогда не спрашивать», затем, следующийКогда вы запрашиваете разрешение, вы можете знать, что это происходит в методе onRequestPermissionsResult
public boolean checkIfShouldShowGoToSettingsDialog(String permissions[], int[] grantResults){
for (int i=0; i<permissions.length; i++){
if (grantResults[i] == PackageManager.PERMISSION_DENIED && !ActivityCompat.shouldShowRequestPermissionRationale(SectionManager.getInstance().getCurrentActivity(), permissions[i])) {
return true;
}
}
return false;
}
Проблема в том, что если вы делаете это, каждый раз, когда вы звоните requestPermission()
, то onRequestPermissionsResult
вызывается снова, даже если ранее было отказано в разрешении, и даже с установленным флажком.Таким образом, checkIfShouldShowGoToSettingsDialog
возвращает true
, потому что разрешение DENIED
, а shouldShowRequestPermissionRationale возвращает false
.Я не хочу этогоЯ хочу отобразить диалоговое окно «Перейти к настройкам приложения» только в первый раз, когда пользователь выбрал «Больше не спрашивать».
Итак, я попробовал кое-что:
Я добавил эту проверку перед вызовом requestPermission()
.Я попытался удалить разрешения, которые возвращают false методу shouldShowRequestPermissionRationale()
, поскольку предполагается, что для этих разрешений установлен флажок:
public String[] removePermanentlyDeniedPermissionsFromArray(String[] permissions){
List<String> result = new ArrayList<>();
for (String permission : permissions) {
if (ActivityCompat.shouldShowRequestPermissionRationale(SectionManager.getInstance().getCurrentActivity(), permission)) {
result.add(permission);
}
}
return result.toArray(new String[result.size()]);
}
Он работал отлично, но ... проблема в том, что при первом открытииприложение, в первый раз, когда вы собираетесь запросить разрешения ... shouldShowRequestPermissionRationale () возвращает FALSE для всех из них !!поэтому никаких разрешений не запрашивается.
Тогда, как мне избежать callrequestPermission (), если пользователь установил флажок "Никогда не спрашивать"?