Приложение некорректно запрашивает права (permission)

206
29 января 2018, 06:06

Имеется приложение, которое записывает звук и сохраняет его в памяти устройства. При первом открытии активити, приложение выдало запрос на разрешение записи аудио. Подтвердил разрешение. Далее при попытке записать звук, приложение крашится, ссылаясь на то что недостаточно прав.

Открываю заново активити, приложение спрашивает уже другое разрешение на сохранение файлов в памяти устройства. После подтверждения прав - всё работает хорошо.

вот эти права:

Util.requestPermission(this, Manifest.permission.RECORD_AUDIO);
Util.requestPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);

Можно как то сделать так, чтобы права запрашивались сразу и на запись и на сохранение? Иначе получается не очень понятно. Я должен один раз открыть активити, подтвердить права, и закрыть активити, и снова его открыть, чтоб подтвердить еще одно разрешение. Код ниже прикрепляю:

public class MainActivityRecord extends AppCompatActivity {
private static final int REQUEST_RECORD_AUDIO = 0;
private static final String AUDIO_FILE_PATH =
        Environment.getExternalStorageDirectory().getPath() + "/recorded_.wav";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_record);
    if (getSupportActionBar() != null) {
        getSupportActionBar().setBackgroundDrawable(
                new ColorDrawable(ContextCompat.getColor(this, R.color.colorPrimary)));
    }
    Util.requestPermission(this, Manifest.permission.RECORD_AUDIO);
    Util.requestPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_RECORD_AUDIO) {
        if (resultCode == RESULT_OK) {
            Toast.makeText(this, "Audio recorded successfully!", Toast.LENGTH_SHORT).show();
        } else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(this, "Audio was not recorded", Toast.LENGTH_SHORT).show();
        }
    }
}
public void recordAudio(View v) {
    AndroidAudioRecorder.with(this)
            // Required
            .setFilePath(AUDIO_FILE_PATH)
            .setColor(ContextCompat.getColor(this, R.color.recorder_bg))
            .setRequestCode(REQUEST_RECORD_AUDIO)
            // Optional
            .setSource(AudioSource.MIC)
            .setChannel(AudioChannel.STEREO)
            .setSampleRate(AudioSampleRate.HZ_48000)
            .setAutoStart(false)
            .setKeepDisplayOn(true)
            // Start recording
            .record();
}}

Util.java:

public class Util {
public static void requestPermission(Activity activity, String permission) {
    if (ContextCompat.checkSelfPermission(activity, permission)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(activity, new String[]{permission}, 0);
    }
}}
Answer 1
public class Util {
public static void requestPermission(Activity activity, String[] permission) {
    if (ContextCompat.checkSelfPermission(activity, permission)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(activity, permission, 0);
    }
}}

А запрос делаем так:

   Util.requestPermission(this, new String[] {Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE } ); 

Заметьте в классе Util на вход теперь идет не одно разрешение, а массив разрешений.

READ ALSO
Максимальный размер окна в undecorated режиме, но не FullScreen

Максимальный размер окна в undecorated режиме, но не FullScreen

Добрый деньОчень надо сделать следующее: создать stage, который будет: undecorated, максимального размера, т

188
Можно ли подать другой источник звука на вход в метод, вместо микрофона?

Можно ли подать другой источник звука на вход в метод, вместо микрофона?

Есть класс, позволяющий записывать звук (в данный момент с микрофона телефона) и далее сохранять на карту памяти файл

200
SaxParser чтение строки

SaxParser чтение строки

Существует проблема, при парсинге SAXParser'ом при чтении строки типа

175
Приложение крашится при чтении из файла

Приложение крашится при чтении из файла

Специально проверял весь код, только с этим фрагментом происходит краш

227