From 0f7786485971bc9f4106e8a0c70a57637765eb0e Mon Sep 17 00:00:00 2001 From: Pierre-Yves Nicolas <6371790+pynicolas@users.noreply.github.com> Date: Fri, 5 Sep 2025 12:11:29 +0200 Subject: [PATCH] Request storage permission to save PDF on Android <= 9 --- .gitignore | 2 ++ app/src/main/AndroidManifest.xml | 2 +- .../java/org/fairscan/app/MainActivity.kt | 36 ++++++++++++++++++- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 6 files changed, 41 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index de9e416..19ef9c9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ /.idea/navEditor.xml /.idea/assetWizardSettings.xml /.idea/androidTestResultsUserPreferences.xml +/.idea/deviceManager.xml +/.idea/deploymentTargetSelector.xml .DS_Store /build /captures diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 842d96e..1dd8b85 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ android:required="false" /> - + + if (isGranted) { + savePdf() + } else { + val message = getString(R.string.storage_permission_denied) + Toast.makeText(context, message, Toast.LENGTH_SHORT).show() + } + } MyScanTheme { val navigation = Navigation( toHomeScreen = { viewModel.navigateTo(Screen.Main.Home) }, @@ -112,7 +133,7 @@ class MainActivity : ComponentActivity() { setFilename = viewModel::setFilename, uiStateFlow = viewModel.pdfUiState, sharePdf = { sharePdf(viewModel.getFinalPdf(), viewModel) }, - savePdf = { savePdf(viewModel.getFinalPdf(), viewModel) }, + savePdf = { checkPermissionThen(storagePermissionLauncher, savePdf) }, openPdf = { openPdf(viewModel.pdfUiState.value.savedFileUri) } ), onCloseScan = { @@ -154,6 +175,19 @@ class MainActivity : ComponentActivity() { startActivity(chooser) } + private fun checkPermissionThen( + requestPermissionLauncher: ManagedActivityResultLauncher, + action: () -> Unit + ) { + val permission = Manifest.permission.WRITE_EXTERNAL_STORAGE + if (SDK_INT < Q && checkSelfPermission(this, permission) != PERMISSION_GRANTED + ) { + requestPermissionLauncher.launch(permission) + } else { + action() + } + } + private fun savePdf(generatedPdf: GeneratedPdf?, viewModel: MainViewModel) { if (generatedPdf == null) return diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 9c8a0a7..00ccc2e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -41,6 +41,7 @@ Scan läuft Teilen PDF teilen + PDF-Datei kann nicht gespeichert werden: Berechtigung verweigert Unbekannte Größe Version Vollständige Lizenz anzeigen diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 8373628..b8b019d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -41,6 +41,7 @@ Scan en cours Partager Partager le PDF + Impossible d’enregistrer le fichier PDF : permission refusée Taille inconnue Version Voir la licence complète diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7acf50f..7c6dc67 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,6 +42,7 @@ Scan in progress Share Share PDF + Cannot save PDF file: permission was denied Unknown size Version View the full license