Имеется приложение, которое записывает звук и сохраняет его в памяти устройства. При первом открытии активити, приложение выдало запрос на разрешение записи аудио. Подтвердил разрешение. Далее при попытке записать звук, приложение крашится, ссылаясь на то что недостаточно прав.
Открываю заново активити, приложение спрашивает уже другое разрешение на сохранение файлов в памяти устройства. После подтверждения прав - всё работает хорошо.
вот эти права:
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);
}
}}
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
на вход теперь идет не одно разрешение, а массив разрешений.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Добрый деньОчень надо сделать следующее: создать stage, который будет: undecorated, максимального размера, т
Есть класс, позволяющий записывать звук (в данный момент с микрофона телефона) и далее сохранять на карту памяти файл
Специально проверял весь код, только с этим фрагментом происходит краш