From 6e81547d839904d1da77d8464a5dee780d1fa931 Mon Sep 17 00:00:00 2001 From: "hasinarak3@gmail.com" Date: Tue, 17 Mar 2026 11:30:56 +0300 Subject: [PATCH] Fix filePicker - Android --- .../kotlin/mg/dot/feufaro/AndroidFileRepository.kt | 7 +++++++ .../kotlin/mg/dot/feufaro/LaunchFilePicker.kt | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/composeApp/src/androidMain/kotlin/mg/dot/feufaro/AndroidFileRepository.kt b/composeApp/src/androidMain/kotlin/mg/dot/feufaro/AndroidFileRepository.kt index 27d603a..8bdbe5c 100644 --- a/composeApp/src/androidMain/kotlin/mg/dot/feufaro/AndroidFileRepository.kt +++ b/composeApp/src/androidMain/kotlin/mg/dot/feufaro/AndroidFileRepository.kt @@ -1,6 +1,7 @@ package mg.dot.feufaro import android.content.Context +import android.net.Uri import feufaro.composeapp.generated.resources.Res import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -30,6 +31,12 @@ class AndroidFileRepository(private val context: Context) : FileRepository { override suspend fun readFileLines(filePath: String): List = withContext(Dispatchers.IO) { try { when { + filePath.startsWith("content://") -> { + val uri = Uri.parse(filePath) + val inputStream = context.contentResolver.openInputStream(uri) + ?: throw IOException("Impossible d'ouvrir : $filePath") + inputStream.bufferedReader(Charsets.UTF_8).readLines() + } filePath.startsWith("assets://") -> { readAssetFileLines(filePath) } diff --git a/composeApp/src/androidMain/kotlin/mg/dot/feufaro/LaunchFilePicker.kt b/composeApp/src/androidMain/kotlin/mg/dot/feufaro/LaunchFilePicker.kt index cf21f41..1ef0f2b 100644 --- a/composeApp/src/androidMain/kotlin/mg/dot/feufaro/LaunchFilePicker.kt +++ b/composeApp/src/androidMain/kotlin/mg/dot/feufaro/LaunchFilePicker.kt @@ -36,6 +36,8 @@ actual fun launchFilePicker( if (mimeTypes.size > 1) { putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes) } + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) } // 3. Lance le sélecteur @@ -50,6 +52,16 @@ fun setFilePickerActivity(activity: ComponentActivity) { ) { result -> if (result.resultCode == Activity.RESULT_OK) { val uri: Uri? = result.data?.data + if (uri != null) { + try { + activity.contentResolver.takePersistableUriPermission( + uri, + Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + } catch (e: Exception) { + println("takePersistableUriPermission failed: ${e.message}") + } + } fileSelectionCallback?.invoke(uri?.toString()) } else { fileSelectionCallback?.invoke(null)