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

问题描述

我想执行以下操作:

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

我的目标是 Android 10(API 级别 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)
    )
}

有没有更好的解决方案?

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

我知道这应该是可能的,因为有许多适用于 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ép\r\n").toByteArray()) // adding BOM to the start for Excel to recognize utf8
//            out?.close()
        }
    }
    super.onActivityResult(requestCode,resultCode,data)
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...