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