如何在Android Q API 30中导出CSV文件WIH OPENCSV库? -Kotlin
我已经学习了如何在此
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我用enviroment.getExternalStorageDireTory()函数解决了此问题
I solved this with Enviroment.getExternalStorageDiretory() function