Несколько последовательных запросов на разрешение не работают

Вызов 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).

Примечание. Взаимодействие запроса разрешений с пользователем может быть прервано. В этом случае вы получите пустые массивы разрешений и результатов, что следует рассматривать как отмену.

Но в документации ничего не сказано о каких прерываниях. И если предположить, что «эти прерывания» являются причиной зарегистрированного поведения, что вызывает эти прерывания с помощью приведенного выше кода, учитывая, что приложение очень простое (все, что оно делает, это запуск и запрашивает у пользователя разрешения).


PS: я нашел похожий вопрос здесь, но в ответе предлагается запросить все необходимые разрешения только один раз за один вызов ActivityCompat.requestPermission(), и это нормально. Но я хочу знать, почему описанный выше метод не работает? или Какие могут быть возможные прерывания?.


person harshatech2012    schedule 17.02.2020    source источник
comment
Вызовите ActivityCompat.requestPermissions() один раз с любыми разрешениями, которые вам нужны (RECORD_AUDIO, READ_CONTACTS или оба).   -  person CommonsWare    schedule 17.02.2020
comment
@CommonsWare - Да, это работает, но почему описанный выше метод (последовательных отдельных запросов) не работает?   -  person harshatech2012    schedule 17.02.2020
comment
Под прикрытием requestPermissions() делает то, что составляет startActivityForResult(). Это не предназначено для нескольких вызовов подряд.   -  person CommonsWare    schedule 17.02.2020