Android Q, scoped storage

164
19 февраля 2022, 01:50

Как известно, в 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);
Answer 1

В Андроид 10 добавлен атрибут для <application>
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.

Answer 2

Лучше уже не станет гугл будет и дальше гайки закручивать, юзай базу в локальном каталоге, а при выходе из активити делай бэкап на флешку через Uri.

Answer 3

Добавь в манифест:

<application
    ...
    android:requestLegacyExternalStorage="true">
READ ALSO
Указать путь к папке

Указать путь к папке

Надо, чтобы пользователь указал путь к папке с файлами через визуальный файловый менеджерНашел следующий код

101
slack использование event api

slack использование event api

Не могу разобраться где взять "Request URL" для ивента, в задаче надо поприветствовать нового участника каналаИ похоже для этого, нужно подписать...

106
Как залить фоновый цвет в SVG изображении луны в процентах

Как залить фоновый цвет в SVG изображении луны в процентах

Я хочу, чтобы цвет фонового изображения SVG заполнялся постепенно, в процентах

86
Получить значение id из ссылки

Получить значение id из ссылки

Давайте перейдем сразу к сути) У меня есть директория console/indexphp

116