Как получить доступ к созданным приложением файлам?
Приложение сохраняет txt файл в общий каталог Android "Documents", вот так:
private File getExternalPath() {
return new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), editName.getText().toString());
}
Это замечательно работает, но когда я пытаюсь перезаписать уже созданный файл с таким именем, то вылетает ошибка доступа. В API 30 больше нельзя работать с файлами из публичных каталогов (почему тогда он сохраняется я тоже не понимаю). Получается я потерял доступ к этому файлу и не могу обновить его. Какие существуют решения данной проблемы? Можно было бы сохранять файл в корень папки моего приложения, но вот незадача, в API 30 заблокировали доступ к data и obb и пользователь не вытащит оттуда этот файл. Может возможно создать отдельный каталог, для которого у моего приложения будет полный доступ?
Ответы (2 шт):
Понятие "полный доступ" к файлу размыто. Доступ кому и в каком виде, кто будет просить и кто давать...
Вы можете изменять файлы в публичных каталогах, однако вам понадобится запрашивать дополнительное разрешение у пользователя на изменение/удаление файла для конкретного 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...
Доступ есть. Папка /storage/****/Android/data/вашпроект/files для пользователей открыт. С программы туда записывается и читается без проблем. Через проводник на устройстве тоже
Путь к своей папке я получаю так
_path_apk_api30 = getExternalFilesDir(null).getPath();
Извиняюсь что не в комментариях. Проверено 11 и 12 андроидах. И уточните, что именно у вас не работает? Может я что-то не понимаю