Вызов ActivityCompat.requestPermission()
с опасными запросами разрешений, несколько раз подряд, вызывает только первый запрос, запрашивающий пользователя с диалоговым окном разрешения. Рассмотрим следующий код:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_recorder);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_DENIED) {
Log.i("Permissions: ", "Requesting audio input --> requestCode: 300");
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.RECORD_AUDIO}, 300);
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_DENIED) {
Log.i("Permissions: ", "Requesting read contacts --> requestCode: 200");
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.READ_CONTACTS}, 200);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
Log.i("Permissions: ", String.format("requestCode: %d --> permissions array length: %d", requestCode, permissions.length));
for (int i = 0; i < permissions.length; i++) {
Log.i("Permissions: ", String.format(
"%s --> %s", permissions[i],
grantResults[i] == PackageManager.PERMISSION_GRANTED));
}
}
Диалоговое окно системы предоставления разрешений появляется только для первого запроса. Затем, независимо от того, принимает ли пользователь / отклоняет запрос, последующий запрос (т. Е. Для чтения контактов в этом случае) не вызывает системное диалоговое окно. Почему это происходит?
Примечание: все запросы были объявлены в файле AndroidManifest. xml.
Ниже приведены журналы: (здесь я выбрал Разрешить в системном диалоговом окне разрешений на аудиовход. Выбор Запретить заменяет только true
на false
в последней строке журнала - остальная часть журнала остается то же самое)
2020-02-17 18:20:01.377 12876-12876/demoapp I/Permissions:: Requesting audio input --> requestCode: 300
2020-02-17 18:20:01.397 12876-12876/demoapp I/Permissions:: Requesting read contacts --> requestCode: 200
2020-02-17 18:20:01.398 12876-12876/demoapp I/Permissions:: requestCode: 200 --> permissions array length: 0
2020-02-17 18:20:13.917 12876-12876/demoapp I/Permissions:: requestCode: 300 --> permissions array length: 1
2020-02-17 18:20:13.917 12876-12876/demoapp I/Permissions:: android.permission.RECORD_AUDIO --> true
Мои исследования: Документация для ActivityCompat.onRequestPermissionsResult()
гласит:
Обратный вызов для результата от запроса разрешений. Этот метод вызывается для каждого вызова ActivityCompat.requestPermissions (android .app.Activity, String [], int).
Примечание: Возможно, взаимодействие запроса пользователя на доступ прервано. В этом случае вы получите пустые разрешения и массивы результатов, которые следует рассматривать как отмену.
Но в документации ничего не говорится о что за прерывания . И если предположить, что « эти прерывания » являются причиной зарегистрированного поведения, , что вызывает эти прерывания с помощью приведенного выше кода - учитывая, что приложение очень базовое c (все, что оно делает запускается и запрашивает у пользователя разрешения).
PS: Я нашел похожий вопрос здесь , но ответ только предлагает спросить все необходимые разрешения один раз за один звонок на ActivityCompat.requestPermission()
, что нормально. Но Я хочу знать, почему не работает вышеуказанный метод? или Какие могут быть возможные прерывания? .