Как известно, в Android Q (API=29) Google в очередной раз изменил правила доступа к внешней памяти (external storage) и ввел понятие Scoped Storage. Теперь: apps that target Android 10 (API level 29) and higher are given scoped access into external storage, or scoped storage, by default. Such apps have access only to the app-specific directory on external storage, as well as specific types of media that the app has created. У меня есть приложение, в которой используется хранение данных юзера в SQLite БД, которая размещается во внешней памяти. Это сделано умышленно, поскольку по предыдущим отзывам было много жалоб юзеров при сносе приложения уничтожались также данные во внутренней памяти (каталог android/android/[пакет приложения]/files). Конечно, в аппе была возможность бэкапа данных и все такое прочее, но юзеры обычно игнорят ее. В итоге, в свое время я принял решение о хранении данных в каталоге /Documents, который возвращался методом Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), который в API 29 обьявлен deprecated Внимание вопрос: что мне надо сделать, чтобы достукиваться до БД SQLite хранящейся во внешней памяти посредством обычного SQLiteOpenHelper - при условии android:targetSdkVersion="29"? Update Под открытием имеется ввиду использование штатной конструкции: SQLiteDatabase db=SQLiteDatabase.openDatabase(file.getPath(), null, SQLiteDatabase.OPEN_READWRITE)
Ответ В Андроид 10 добавлен атрибут для hasFragileUserData When the user uninstalls an app, whether or not to show the user a prompt to keep the app's data. The default value is "false". То есть при установленном значении true юзеру будет предоставлен выбор удалять ли данные вместе с приложением. Конечно хотелось бы большего: какие-никакие настройки (что бы не думать куда пихать временные файлы так чтобы они потом не остались мёртвым грузом и не напугали юзера своим размером) и чтоб галочка была включена по-умолчанию или по выбору... Эту опцию нужно было добавить давным-давно - многие разработчики в принципе лезли во внешнюю память только из-за её отсутствия. К сожалению, атрибут никак не влияет на устройства c API старше 29.