如何在Android Q API 30中导出CSV文件WIH OPENCSV库? -Kotlin

发布于 2025-02-03 09:58:57 字数 2243 浏览 1 评论 0原文

我已经学习了如何在此

enfortervice.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)

有人可以给我解决方案吗?

I have learn how to export CSV file in this link, but I have problem to export in android API 30+. I have tried with MediaStore to writing file but no luck.

Problem in 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)
        }
}

Output Log

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)

Can anyone give me solutions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

挽手叙旧 2025-02-10 09:58:57

我用enviroment.getExternalStorageDireTory()函数解决了此问题

I solved this with Enviroment.getExternalStorageDiretory() function

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文