使用 Android 10+ 的直接文件访问(SQlite 数据库)

Direct file access (SQlite database) with Android 10+

我有 2 个应用程序 A 和 B。A 可以将数据下载到 B 拥有的 sqlite 数据库。直到现在我向用户询问了 WRITE_EXTERNAL_STORAGE 权限,A 可以直接写入 B 的数据库,因此使用事务以避免在用户取消进程时更改数据库。

有了 Android10,直接文件访问似乎不再可能,因为我们被迫使用 ****** SAF...

为了继续运行,我更新了我的应用程序以使用 ContentProvider。但是,我无法再使用事务来提供取消功能:数据太重,无法放入内存,我无法使用 ContentProvider 的批量插入方法(如果我没记错的话?)。

我卡住了吗?或者是否有一种解决方案可以在我拥有的两个应用程序之间授予直接文件访问权限?理想情况下,他的过程应该是这样的:

这可能吗?

编辑:我需要访问 File 对象,以便使用 SqliteDatabaseOpenHelper class,因此 grantUriPermission 对我没有帮助。

is there a solution to grant a direct file access between two apps I own?

没有

Am I stuck?

你可以这样做:

  • 一个下载文件1
  • 一个下载文件2
  • [...]
  • 一个下载文件n
  • A通过某种方式告诉B"yo, I downloaded these files"(见下文),如果用户没有取消操作
  • B更新自己的数据库

"By some means" 可以是:

  • insert()update() 与您的 ContentProvider
  • startService()
  • 下达的命令
  • bindService() 和对 B 服务
  • 公开的 AIDL 定义的 API 的调用
  • 带有显式 Intent
  • 的广播 Intent
  • 在 B 中启动一个 activity,如果这合适(可能不合适,只是为了完整性而提及)

A 有一个 "user transaction" 并且可以根据用户交互停止其下载。下载完成后,B 可以执行数据库事务以使用下载内容的详细信息更新自己的数据库。