[英]How to save only lines containing a particular String (in a CSV file) as a separate CSV file?
[英]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.