Прямой доступ к файлам (база данных SQlite) с Android 10+ - PullRequest
1 голос
/ 13 января 2020

У меня есть 2 приложения A и B. A может загружать данные в базу данных sqlite, принадлежащую B. До сих пор я спрашивал пользователя о разрешении WRITE_EXTERNAL_STORAGE, и A мог напрямую записывать в базу данных B и, таким образом, использовать транзакции, чтобы избежать изменения база данных, если пользователь отменяет процесс.

При Android 10 прямой доступ к файлам больше не представляется возможным, поскольку мы вынуждены использовать этот ****** SAF ...

Чтобы по-прежнему работать, я обновил свои приложения для использования ContentProvider. Однако я больше не могу использовать транзакции для предоставления функции отмены: данные слишком тяжелы для размещения в памяти, я не могу использовать методы пакетной вставки ContentProvider (если я не ошибаюсь?).

Я застрял? Или есть решение предоставить прямой доступ к файлам между двумя приложениями, которыми я владею? В идеале он должен выглядеть следующим образом:

  • 1 запрашивает у B доступ к файлу
  • B предоставляет доступ
  • A запускает транзакцию
  • A файл загрузки 1
  • файл загрузки 2
  • [...]
  • файл загрузки n
  • A фиксирует транзакцию (или откаты по запросу пользователя) отменить)
  • A уведомляет B, что загрузка завершена
  • B отменяет доступ

Возможно ли это?

РЕДАКТИРОВАТЬ: Мне нужно доступ к объекту File для использования класса SqliteDatabaseOpenHelper, поэтому grantUriPermission мне не поможет.

1 Ответ

0 голосов
/ 13 января 2020

существует ли решение для предоставления прямого доступа к файлам между двумя моими приложениями?

Нет.

Я застрял?

Вы можете сделать:

  • Файл загрузки 1
  • Файл загрузки 2
  • [...]
  • A загрузить файл n
  • A сообщает B "yo, я скачал эти файлы" каким-то образом (см. ниже), если пользователь не отменил операцию
  • B обновляет свою собственную базу данных

"Некоторым образом" может быть:

  • insert() или update() с вашей ContentProvider
  • командой, доставленной startService()
  • bindService() и вызов API, определенного AIDL, предоставляемый службой B
  • широковещательная рассылка Intent с явным Intent
  • запуском операции в B, если это было бы уместно (возможно, нет, просто упомяну для полноты)

A имеет «пользовательскую транзакцию» и может остановить ее загрузки на основе взаимодействия с пользователем. После завершения загрузки B может выполнить транзакцию базы данных, чтобы обновить свою собственную базу данных с информацией о загруженном материале.

...