Как получить доступ к созданным приложением файлам?

Приложение сохраняет txt файл в общий каталог Android "Documents", вот так:

private File getExternalPath() {
    return new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), editName.getText().toString());
}

Это замечательно работает, но когда я пытаюсь перезаписать уже созданный файл с таким именем, то вылетает ошибка доступа. В API 30 больше нельзя работать с файлами из публичных каталогов (почему тогда он сохраняется я тоже не понимаю). Получается я потерял доступ к этому файлу и не могу обновить его. Какие существуют решения данной проблемы? Можно было бы сохранять файл в корень папки моего приложения, но вот незадача, в API 30 заблокировали доступ к data и obb и пользователь не вытащит оттуда этот файл. Может возможно создать отдельный каталог, для которого у моего приложения будет полный доступ?


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

Автор решения: Yura Ivanov

Понятие "полный доступ" к файлу размыто. Доступ кому и в каком виде, кто будет просить и кто давать...

Вы можете изменять файлы в публичных каталогах, однако вам понадобится запрашивать дополнительное разрешение у пользователя на изменение/удаление файла для конкретного uri.

Псевдокод:

try (os = context.getContentResolver().openOutputStream(uri)){
  os.write(bytes);
  os.close();
} catch (SecurityException se){
  if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
    pendingIntent = MediaStore.createWriteRequest(context.getContentResolver(), uri);
    pendingIntent.sendIntent(...);// или по модному через контракты pendingIntet.intentSender
  }
}

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

В Q работает чуть по-другому. Для Build.VERSION.SDK_INT == Build.VERSION_CODES.Q выбрасывается RecoverableSecurityException, из него можно получить примерно такой же PendingIntent se.userAction.actionIntent.

Ваши файлы также могут быть доступны вне приложения, например, вы их можете шарить через стандартные intent'ы в другие приложения, тут понадобится реализация в приложении СontentProvider'а. Тут целая тема, в ответе кратко ее не расскажешь. Там и authorities и uri permissions...

→ Ссылка
Автор решения: Arty Morris

Доступ есть. Папка /storage/****/Android/data/вашпроект/files для пользователей открыт. С программы туда записывается и читается без проблем. Через проводник на устройстве тожевведите сюда описание изображения

Путь к своей папке я получаю так

_path_apk_api30 = getExternalFilesDir(null).getPath();

Извиняюсь что не в комментариях. Проверено 11 и 12 андроидах. И уточните, что именно у вас не работает? Может я что-то не понимаю

→ Ссылка