如何处理由PC创建的Android设备上的文件?API级别29



我想做以下事情:

  • 读取和编辑通过连接到PC的USB线在设备上创建的文件。
  • 写入用户在windows文件资源管理器中打开设备内部存储时可见的文件。

我的目标是Android 10 (API level 29)。

我能找到的读取文件的最佳解决方案是已弃用的

val containerFile = File(
getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
"myFile.csv"
)
// Then I was able to read files from
val inputStream: InputStream = contentResolver.openInputStream(Uri.fromFile(containerFile))!!

这样当我放置"myFile.csv"在下载文件夹中,我的应用程序可以读取内容。

至于创建PC可读的文件,我发现的唯一解决方案是创建隐藏的临时文件,每当我必须使它们在PC上可读时,我创建了一个意图如下:

val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "file/csv"
putExtra(Intent.EXTRA_TITLE, "output.csv")
// I specify a URI for the directory that should be opened in  the system file picker
putExtra(
DocumentsContract.EXTRA_INITIAL_URI,
getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
)
}

有更好的解决方案吗?

如果没有,我如何获得一个路径,从PC可见的目录,使用API 29?

我知道这应该是可能的,因为有许多android文本编辑器应用程序,这是做同样的事情,我想,但我没能找到任何教程。我需要一个长期的解决方案,我很困惑……非常感谢!

非常感谢@CommonsWare的建议!

ACTION_OPEN_DOCUMENT_TREE和GET_PERSISTABLE_PERMISSION允许访问用户选择的文件夹和其中的所有文件。应用程序创建的任何内容都可以在PC上看到。

我需要的是

startActivityForResult(Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), GET_PERSISTABLE_PERMISSION)

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == GET_PERSISTABLE_PERMISSION && resultCode == Activity.RESULT_OK) {
//FileHandler.onActivityResult(data)
data?.data?.also{ uri->
val contentResolver = applicationContext.contentResolver
val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
contentResolver.takePersistableUriPermission(uri, takeFlags)
//          Write a test file in the selected folder
//            val pickedDir = DocumentFile.fromTreeUri(this, uri)
//            val tmpFile = pickedDir.createFile("text/csv", "debugTestFile")
//            val out: OutputStream? = getContentResolver().openOutputStream(tmpFile!!.uri)
//            out?.write(("uFEFF" + "árvíztűrő tükörfúrógéprn").toByteArray()) // adding BOM to the start for Excel to recognize utf8
//            out?.close()
}
}
super.onActivityResult(requestCode, resultCode, data)
}