将文件保存到云存储,并在Android的不同设备上进行修改



我希望我的应用程序可以让用户将文件保存到云存储服务,如Google Drive,并在不同的设备上打开和编辑该文件。

我尝试使用这里解释的存储访问框架,但有以下问题:

当设备B上的应用程序打开由设备a上的应用程序创建的文件时,似乎创建了该文件的新版本。

。,在设备B上修改文件并保存到Google Drive(使用打开文件时获取的Uri)后,在设备A上打开文件时,不会反映更改。反之亦然

Dropbox显示了类似的行为,不同的是不同的版本显示在Dropbox应用程序中,而在Drive应用程序和web界面中,只显示一个版本的文件。

如何解决这个问题?

  1. 这是存储访问框架固有的吗是否有其他云存储提供商没有出现此问题?

  2. 我担心唯一的解决方案是直接使用Google Drive API(这会阻止用户使用其他服务),还是有一个更简单、更通用的解决方案?

下面是我尝试的简化代码:

var uri: Uri? = null
fun save() {
if (uri == null) {
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "text/plain"
putExtra(Intent.EXTRA_TITLE, "test.txt")
}
startActivityForResult(intent, SAVE)
}
else
write()
}
fun open() {
if (uri == null) {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "text/plain"
}
startActivityForResult(intent, OPEN)
}
else
read()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == SAVE) {
uri = data?.data
write()
}
else if (requestCode == OPEN) {
uri = data?.data
read()
}
}
fun write() {
contentResolver.openFileDescriptor(uri!!, "w")?.use {
FileOutputStream(it.fileDescriptor).use {
it.channel.truncate(0)
it.write(string_to_save.toByteArray())
}
}
}
fun read() {
contentResolver.openInputStream(uri!!)?.use {
BufferedReader(InputStreamReader(it)).use {
string_from_file = it.readLine()
}
}
}

我已经有了部分解决方案。当我发现更多信息时,我会更新这个答案。

对于box (https://www.box.com),这个问题实际上没有发生,所以它不是存储访问框架固有的。

盒子编辑:似乎是唯一一个流行的云提供商,通过存储访问框架在不同设备上修改文件而不会出现这个问题。

  • OneDrive, Amazon Drive, Yandex Disk, Mega, MediaFire似乎没有注册自己的存储访问框架(不显示在保存对话框)
  • Google Drive, Dropbox, pCloud从其他设备访问文件时创建新版本