【问题标题】:How to export CSV File wih OpenCSV Library in Android Q API 30? - Kotlin如何在 Android Q API 30 中使用 OpenCSV 库导出 CSV 文件? - 科特林
【发布时间】:2022-06-10 18:29:52
【问题描述】:

我已经学习了如何在这个link 中导出 CSV 文件,但是我在 android API 30+ 中导出时遇到了问题。我曾尝试使用 MediaStore 写入文件,但没有成功。

ExportService.kt 中的问题

object ExportService {

    fun <T : Exportable> export(context: Context, type: Exports, content: List<T>): Flow<Boolean> =
        when (type) {
            is Exports.CSV -> writeToCSV<T>(context, type.csvConfig, content)
        }

    private fun <T : Exportable> writeToCSV(
        context: Context,
        csvConfig: CsvConfig,
        content: List<T>
    ) =
        flow {
            with(csvConfig) {
                val collection = sdk29AndUp {
                    MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
                } ?: MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL)
                val values = ContentValues().apply {
                    put(MediaStore.MediaColumns.DISPLAY_NAME, filename)
                    put(MediaStore.MediaColumns.MIME_TYPE, "text/csv")
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                        put(
                            MediaStore.MediaColumns.RELATIVE_PATH,
                            Environment.DIRECTORY_DOCUMENTS + "/Medisy's Clinic/"
                        )
                    }
                }
                val uri = context.contentResolver.insert(collection, values)
                Log.e("TAG", "writeToCSV: ${uri!!.path} $filename")
                val csvWriter = CSVWriter(FileWriter(uri!!.path?.let { File(it) }))

                StatefulBeanToCsvBuilder<T>(csvWriter)
                    .withSeparator(CSVWriter.DEFAULT_SEPARATOR)
                    .build()
                    .write(content)

                csvWriter.close()
            }
            emit(true)
        }
}

输出日志

E/TAG: writeToCSV: /external_primary/file/40 Medisy's Clinics-May_31_2022_10:58:58_AM.csv
W/System.err: java.io.FileNotFoundException: /external_primary/file/40: open failed: ENOENT (No such file or directory)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:492)
W/System.err:     at com.example.medisyclinics.data.csv.ExportService$writeToCSV$1.invokeSuspend(ExportService.kt:47)

谁能给我解决方案?

【问题讨论】:

  • 是的,路径是错误的。您不能将 uri 的路径部分用于 File 类。您知道如何创建 csv 文件。在 30+ 上,您可以使用相同的代码。只使用不同的路径。不需要媒体商店。
  • 好的。谢谢,我会尝试以不同的方式获取路径

标签: android csv kotlin opencsv


【解决方案1】:

我用 Enviroment.getExternalStorageDiretory() 函数解决了这个问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-20
    • 2021-04-05
    • 2021-12-23
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多