Как создать папку или файл используя Scoped Storage

Как создать папку или файл в Android 10 используя Scoped Storage?

Сейчас есть метод, который работает на Android 9 и записывает в папку аудиопоток. Как его переделать под Android 10 и выше?

@Override
protected Object doInBackground(Object[] objects) {

    isRecording = true;
    try {
        URL url = new URL(urlPath);
        InputStream inputStream = url.openStream();

        File direct = new File(Environment.getExternalStorageDirectory() + File.separator + AppConstants.dirName);

        if (!direct.exists()) {
            File musicFolder = new File(Environment.getExternalStorageDirectory() + File.separator + AppConstants.dirName);
            musicFolder.mkdirs();
        }

        File file = new File(Environment.getExternalStorageDirectory() + File.separator + AppConstants.dirName, recordedFileName);
        System.out.println(file.getAbsoluteFile());
        OutputStream outputStream = new FileOutputStream(file);

        byte[] buffer = new byte[4*1024];
        int read;

        while ((read = inputStream.read(buffer)) != -1) {
            if(isCancelled())
                break;
            outputStream.write(buffer,0,read);
        }
        outputStream.flush();
        outputStream.close();
        inputStream.close();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }


    return null;
}

Ответы (1 шт):

Автор решения: Barmaley

Создаем каталог так:

1)Стартуем Intent.ACTION_OPEN_DOCUMENT_TREE, примерно так:

 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
 intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION  |
                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION  |
                    Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
 startActivityForResult(intent,REQUEST_FOLDER);

2)Юзеру будет предъявлен системный файл селектор, в котором он сможет выбрать каталог

3)Ловим в onActivityResult выбранный юзером каталог, который обрабатываем примерно так:

//сначала получаем постоянный доступ на запись и чтение к каталогу
ContentResolver contentResolver = context.getContentResolver();
int takeFlags = intent.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION |
            Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Uri folderUri = intent.getData();
contentResolver.takePersistableUriPermission(folderUri, takeFlags); 
//далее получаем ссылку на каталог в виде DocumentDile
DocumentFile pickedDir = DocumentFile.fromTreeUri(context, folderUri);
//создаем каталог
pickedDir.createDirectory("my_folder);

Для создания файла

Надо запустить Intent.ACTION_CREATE_DOCUMENT и поймать ссылку на него в onActivityResult

→ Ссылка