File.mkdirs () возвращает false даже с разрешениями

У меня такой код:

private int REQUEST_CODE_PERMISSIONS = 1001;
private final String[] REQUIRED_PERMISSIONS = new String[]{"android.permission.CAMERA", "android.permission.WRITE_EXTERNAL_STORAGE"};

public String getBatchDirectoryName() {
    String app_folder_path = "";
    

    if (allPermissionsGranted()){
        Log.e("i enter this code","!");
        app_folder_path = Environment.getExternalStorageDirectory().toString() + "/images";
        File dir = new File(app_folder_path);
        if (!dir.exists() && !dir.mkdirs()) { //both are false but why?
            Log.e("failed to create:",app_folder_path); ///returns: storage/emulated/0/images
        }

    }else{
        app_folder_path = "fail"; // i DONT enter this code t
    }
    return app_folder_path;
}

private boolean allPermissionsGranted(){

    for(String permission : REQUIRED_PERMISSIONS){
        if (ContextCompat.checkSelfPermission(getContext(), permission) != PackageManager.PERMISSION_GRANTED){
            return false;
        }
    }
    return true;
}

Я пытаюсь сохранить изображение, поэтому использую функцию getBatchDirectoryName() для создания каталога, если он не существует, или для возврата существующего каталога.

Проблема в том, что каталог не существует, я не могу его создать по какой-то причине. Обе функции exists и mkdirs возвращают false. В чем может быть причина? Я проверяю перед тем, есть ли у меня разрешение на запись файлов.

Этот код не будет работать на Android 11+, как только ваш targetSdkVersion повысится до 30. Вы больше не можете создавать каталоги в произвольных местах. Пожалуйста, рассмотрите возможность использования Storage Access Framework и разрешите пользователю выбирать, где на устройстве пользователя (или в облачном хранилище пользователя) ваше приложение должно размещать контент пользователя.

CommonsWare 08.04.2021 23:28
app_folder_path = Environment.getExternalStorageDirectory().toString() + "/images"; `Перейдите на app_folder_path = Environment.getExternalStoragePublicDirectory(Environment.DI‌​RECTORY_PICTURES).to‌​String() + "/images";, и он будет работать на Android 11. Для Android вы можете использовать свой старый код, если вы запрашиваете устаревшее внешнее хранилище в манифесте.
blackapps 08.04.2021 23:41

Я не думаю, что тег makefile означает то, что вы думаете :). Его следует убрать из этого вопроса ИМО.

MadScientist 09.04.2021 01:20

@CommonsWare спасибо за информацию. Я попробую, когда вернусь домой, если это сработает, и дам знать

Funny Moments 09.04.2021 08:46

@blackapps спасибо за информацию. Я попробую, когда вернусь домой, если это сработает, и дам знать

Funny Moments 09.04.2021 08:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
26
0

Другие вопросы по теме