簡體   English   中英

如何處理由 PC 創建的 Android 設備上的文件? 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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM