如何处理 Android 设备上由 PC 创建的文件? API 29级
How do I handle files on Android device that are created by a PC? API level 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)
}
我想做以下事情:
- 读取和编辑通过连接到 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)
}