簡體   English   中英

如何將 csv 字符串保存到文件中?

[英]How do I save a csv string to a file?

我有一個 function 生成一個 csv 字符串getSummaryCsvString() 我想將它保存到一個文件中,以便它可以與發送意圖一起使用,以便用戶可以 email 文件,將其保存到 Google Drive 等。但是當我嘗試保存文件時,我收到此錯誤:

Writing csv summary failed: java.io.FileNotFoundException: summary.csv: open failed: EROFS (Read-only file system)

相關代碼:

    override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
        R.id.summaryExportBtn -> {
            val filename = "summary.csv"
            val summaryFile = File.createTempFile("summary", "csv")
            val fileWriter: FileWriter?

            try {
                fileWriter = FileWriter(filename)
                fileWriter.append(getSummaryCsvString())
                Log.d(FDSLogTag, "Writing csv summary succeeded")
                val sendIntent = Intent()
                sendIntent.action = Intent.ACTION_SEND
                sendIntent.putExtra(Intent.EXTRA_STREAM, summaryFile)
                sendIntent.type = "text/csv"
                startActivity(Intent.createChooser(sendIntent, "SHARE"))
            } catch (e: Exception) {
                Log.d(FDSLogTag, "Writing csv summary failed: $e")
                val toast = Toast.makeText(this.applicationContext, "Writing csv summary failed: $e", Toast.LENGTH_LONG)
                toast.show()
            }

            true
        }

        else -> {
            super.onOptionsItemSelected(item)
        }
    }

如何成功將 csv 字符串保存到文件並共享?

首先,在<application>部分的 AndroidManifest.xml 文件中創建一個文件提供程序:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
</provider>

接下來,在 app > res > xml 中創建提供程序路徑文件 provider_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="mypath" path="mypath/" />
</paths>

最后,編寫代碼來創建文件。 檢查目錄是否存在很重要; 如果沒有,則需要創建它。

try {
    val filename = "myfilename.csv"
    val myPath = File(filesDir, "mypath") // mypath must match your provider xml path attribute
    if (!myPath.exists()) {
        myPath.mkdir()
    }
    val myFile = File(myPath, filename)

    FileOutputStream(myFile).use { stream ->
        stream.write(myCsvString.toByteArray())
    }
} catch (e: Exception) {
    Log.d("logtag", "Writing csv failed: $e")
    val toast = Toast.makeText(this.applicationContext, "Writing csv failed: $e", Toast.LENGTH_LONG)
    toast.show()
}

暫無
暫無

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

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