privacy policy

This commit is contained in:
Hadrian Burkhardt
2026-05-10 01:09:25 +02:00
parent cd73c35c4d
commit 9c295532df
10 changed files with 236 additions and 14 deletions
+58
View File
@@ -0,0 +1,58 @@
# Privacy Policy
Last updated: 2026-05-10
Private QR Scanner is provided by SoftwareApp-HB.
Contact: softwareapp.hb@gmail.com
This policy explains how Private QR Scanner handles data on your device.
## What the App Accesses
Camera: The app uses the camera only to scan QR codes and barcodes. Camera frames are processed on your device and are not saved by the app.
Selected images: If you choose to scan from an image, the app reads that selected image only to detect QR codes or barcodes. The app does not keep a copy of the image.
Scanned content: The app displays scanned content on your device. If you enable Save history (local), the scanned content, content type, and scan time are stored locally on your device. History is off by default.
Settings: The app stores your local preferences, such as whether history, security warnings, scan feedback, and the selected use-case view are enabled.
Event and ticketing data: Imported whitelist IDs and batch scan results are processed locally. Whitelist IDs are kept in memory for the current app session and are not uploaded by the app.
## How Data Is Used
Data is used to scan codes, show scan results, provide local security warnings, support optional local history, support event and ticketing workflows, and run actions that you choose.
## Data Collection and Sharing
Private QR Scanner does not create accounts, show ads, use analytics, use tracking SDKs, use crash reporting SDKs, or send app data to a developer backend. The app does not request the Android Internet permission.
The developer does not receive, collect, sell, or share your scanned content, selected images, history, settings, or whitelist data.
Data can leave your device only when you choose an Android or third-party action, such as Open, Share, Call, SMS, Email, Add contact, Add calendar event, Wi-Fi settings, or Google Play review. Those actions are handled by Android, Google Play, or the app or service you choose, and their privacy practices apply.
## Storage, Retention, and Deletion
Optional scan history and settings are stored in app-private storage on your device. Android app backup is disabled for this app.
Scan history remains on your device until you delete individual entries, delete all history, turn history off and choose to delete existing history, clear the app data, or uninstall the app.
Settings remain on your device until you change them, clear the app data, or uninstall the app.
Camera frames, selected images, imported whitelist IDs, and batch scan results are not retained by the app after the active use or app session ends, unless the resulting scanned content is saved to local history because you enabled that setting.
## Security
The app relies on Android app-private storage and Android permission controls. Keep your device screen lock and operating system security updates enabled to protect local data.
## Children
The app is not directed to children and does not knowingly collect personal data from anyone.
## Changes
If this policy changes, the updated policy will be included in the app and in the public policy copy for the app.
## Contact
For privacy questions or deletion requests about data that may have been sent through an external action you chose, contact the relevant external service. For questions about this app, contact SoftwareApp-HB at softwareapp.hb@gmail.com.
+1
View File
@@ -23,6 +23,7 @@ Offline-first, ad-free QR/barcode scanner built with Kotlin, Jetpack Compose, Ca
- Keine Tracker/Analytics/Crashlytics - Keine Tracker/Analytics/Crashlytics
- Kein Backend, keine Servercalls - Kein Backend, keine Servercalls
- Keine `INTERNET`-Permission im Manifest - Keine `INTERNET`-Permission im Manifest
- Datenschutzerklärung in der App und als [PRIVACY_POLICY.md](PRIVACY_POLICY.md)
## MVP Features ## MVP Features
- Home: Scan-Button, lokaler Historie-Toggle (Default: OFF), Datenschutz-Dialog - Home: Scan-Button, lokaler Historie-Toggle (Default: OFF), Datenschutz-Dialog
+1 -1
View File
@@ -11,7 +11,7 @@
<application <application
tools:targetApi="33" tools:targetApi="33"
android:name=".CleanScannerApp" android:name=".CleanScannerApp"
android:allowBackup="true" android:allowBackup="false"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:localeConfig="@xml/locales_config" android:localeConfig="@xml/locales_config"
@@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Switch import androidx.compose.material3.Switch
@@ -31,16 +30,7 @@ fun HomeScreen(
val showPrivacyDialog = remember { mutableStateOf(false) } val showPrivacyDialog = remember { mutableStateOf(false) }
if (showPrivacyDialog.value) { if (showPrivacyDialog.value) {
AlertDialog( PrivacyPolicyDialog(onDismiss = { showPrivacyDialog.value = false })
onDismissRequest = { showPrivacyDialog.value = false },
title = { Text(text = stringResource(R.string.privacy)) },
text = { Text(text = stringResource(R.string.privacy_text)) },
confirmButton = {
TextButton(onClick = { showPrivacyDialog.value = false }) {
Text(text = stringResource(R.string.confirm))
}
}
)
} }
Column( Column(
@@ -0,0 +1,47 @@
package de.softwareapp_hb.privateqrscanner.ui.screens
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import de.softwareapp_hb.privateqrscanner.R
@Composable
fun PrivacyPolicyDialog(onDismiss: () -> Unit) {
val context = LocalContext.current
val configuration = LocalConfiguration.current
val policyText = remember(context, configuration) {
context.resources.openRawResource(R.raw.privacy_policy)
.bufferedReader()
.use { it.readText() }
}
AlertDialog(
onDismissRequest = onDismiss,
title = { Text(text = stringResource(R.string.privacy_policy)) },
text = {
Text(
text = policyText,
modifier = Modifier
.heightIn(max = 420.dp)
.verticalScroll(rememberScrollState()),
style = MaterialTheme.typography.bodyMedium
)
},
confirmButton = {
TextButton(onClick = onDismiss) {
Text(text = stringResource(R.string.close))
}
}
)
}
@@ -36,6 +36,7 @@ fun SettingsScreen(
val context = LocalContext.current val context = LocalContext.current
val showDeleteConfirm = remember { mutableStateOf(false) } val showDeleteConfirm = remember { mutableStateOf(false) }
val showUseCasePicker = remember { mutableStateOf(false) } val showUseCasePicker = remember { mutableStateOf(false) }
val showPrivacyPolicy = remember { mutableStateOf(false) }
if (showDeleteConfirm.value) { if (showDeleteConfirm.value) {
AlertDialog( AlertDialog(
@@ -85,6 +86,10 @@ fun SettingsScreen(
) )
} }
if (showPrivacyPolicy.value) {
PrivacyPolicyDialog(onDismiss = { showPrivacyPolicy.value = false })
}
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
@@ -126,6 +131,9 @@ fun SettingsScreen(
Text(text = stringResource(R.string.version)) Text(text = stringResource(R.string.version))
Text(text = stringResource(R.string.licenses)) Text(text = stringResource(R.string.licenses))
Text(text = stringResource(R.string.contact)) Text(text = stringResource(R.string.contact))
TextButton(onClick = { showPrivacyPolicy.value = true }) {
Text(text = stringResource(R.string.privacy_policy))
}
Spacer(modifier = Modifier.height(12.dp)) Spacer(modifier = Modifier.height(12.dp))
TextButton(onClick = { InAppReviewRequester.requestReview(context) }) { TextButton(onClick = { InAppReviewRequester.requestReview(context) }) {
Text(text = stringResource(R.string.review_app)) Text(text = stringResource(R.string.review_app))
@@ -0,0 +1,57 @@
Datenschutzerklärung
Stand: 10.05.2026
Private QR Scanner wird von SoftwareApp-HB bereitgestellt.
Kontakt: softwareapp.hb@gmail.com
Diese Erklärung beschreibt, wie Private QR Scanner Daten auf deinem Gerät verarbeitet.
Worauf die App zugreift
Kamera: Die App nutzt die Kamera nur zum Scannen von QR-Codes und Barcodes. Kamerabilder werden auf deinem Gerät verarbeitet und nicht von der App gespeichert.
Ausgewählte Bilder: Wenn du ein Bild zum Scannen auswählst, liest die App dieses ausgewählte Bild nur zur Erkennung von QR-Codes oder Barcodes. Die App behält keine Kopie des Bildes.
Gescannte Inhalte: Die App zeigt gescannte Inhalte auf deinem Gerät an. Wenn du Historie speichern (lokal) aktivierst, werden gescannter Inhalt, Inhaltstyp und Scanzeit lokal auf deinem Gerät gespeichert. Die Historie ist standardmäßig ausgeschaltet.
Einstellungen: Die App speichert lokale Einstellungen, zum Beispiel ob Historie, Sicherheitswarnungen, Scan-Feedback und die gewählte Use-Case-Ansicht aktiviert sind.
Event- und Ticketdaten: Importierte Whitelist-IDs und Stapel-Scans werden lokal verarbeitet. Whitelist-IDs bleiben im Arbeitsspeicher der aktuellen App-Sitzung und werden von der App nicht hochgeladen.
Wie Daten genutzt werden
Daten werden genutzt, um Codes zu scannen, Scan-Ergebnisse anzuzeigen, lokale Sicherheitswarnungen bereitzustellen, die optionale lokale Historie zu ermöglichen, Event- und Ticketing-Abläufe zu unterstützen und von dir gewählte Aktionen auszuführen.
Datenerhebung und Weitergabe
Private QR Scanner erstellt keine Konten, zeigt keine Werbung, verwendet keine Analysefunktionen, nutzt keine Tracking-SDKs, nutzt keine Crash-Reporting-SDKs und sendet keine App-Daten an ein Entwickler-Backend. Die App fordert keine Android-Berechtigung für Internetzugriff an.
Der Entwickler erhält, erhebt, verkauft oder teilt keine gescannten Inhalte, ausgewählten Bilder, Historie, Einstellungen oder Whitelist-Daten.
Daten können dein Gerät nur verlassen, wenn du eine Android- oder Drittanbieteraktion auswählst, zum Beispiel Öffnen, Teilen, Anrufen, SMS, E-Mail, Kontakt hinzufügen, Kalendereintrag hinzufügen, WLAN-Einstellungen oder Google-Play-Bewertung. Diese Aktionen werden von Android, Google Play oder der von dir gewählten App beziehungsweise dem gewählten Dienst verarbeitet. Deren Datenschutzpraktiken gelten dann.
Speicherung, Aufbewahrung und Löschung
Optionale Scan-Historie und Einstellungen werden im privaten App-Speicher auf deinem Gerät gespeichert. Android-App-Backups sind für diese App deaktiviert.
Die Scan-Historie bleibt auf deinem Gerät, bis du einzelne Einträge löschst, die gesamte Historie löschst, die Historie deaktivierst und vorhandene Einträge löschen lässt, die App-Daten löschst oder die App deinstallierst.
Einstellungen bleiben auf deinem Gerät, bis du sie änderst, die App-Daten löschst oder die App deinstallierst.
Kamerabilder, ausgewählte Bilder, importierte Whitelist-IDs und Stapel-Scans werden von der App nach der aktiven Nutzung oder App-Sitzung nicht aufbewahrt, außer der daraus erkannte gescannte Inhalt wird in der lokalen Historie gespeichert, weil du diese Einstellung aktiviert hast.
Sicherheit
Die App nutzt den privaten App-Speicher und die Berechtigungssteuerung von Android. Nutze eine Gerätesperre und aktuelle Sicherheitsupdates deines Betriebssystems, um lokale Daten zu schützen.
Kinder
Die App richtet sich nicht an Kinder und erhebt wissentlich keine personenbezogenen Daten von Personen.
Änderungen
Wenn sich diese Erklärung ändert, wird die aktualisierte Erklärung in die App und in die öffentliche Kopie der Datenschutzerklärung aufgenommen.
Kontakt
Bei Datenschutzfragen oder Löschanfragen zu Daten, die durch eine von dir gewählte externe Aktion übertragen wurden, wende dich an den jeweiligen externen Dienst. Bei Fragen zu dieser App kontaktiere SoftwareApp-HB unter softwareapp.hb@gmail.com.
+57
View File
@@ -0,0 +1,57 @@
Privacy Policy
Last updated: 2026-05-10
Private QR Scanner is provided by SoftwareApp-HB.
Contact: softwareapp.hb@gmail.com
This policy explains how Private QR Scanner handles data on your device.
What the app accesses
Camera: The app uses the camera only to scan QR codes and barcodes. Camera frames are processed on your device and are not saved by the app.
Selected images: If you choose to scan from an image, the app reads that selected image only to detect QR codes or barcodes. The app does not keep a copy of the image.
Scanned content: The app displays scanned content on your device. If you enable Save history (local), the scanned content, content type, and scan time are stored locally on your device. History is off by default.
Settings: The app stores your local preferences, such as whether history, security warnings, scan feedback, and the selected use-case view are enabled.
Event and ticketing data: Imported whitelist IDs and batch scan results are processed locally. Whitelist IDs are kept in memory for the current app session and are not uploaded by the app.
How data is used
Data is used to scan codes, show scan results, provide local security warnings, support optional local history, support event and ticketing workflows, and run actions that you choose.
Data collection and sharing
Private QR Scanner does not create accounts, show ads, use analytics, use tracking SDKs, use crash reporting SDKs, or send app data to a developer backend. The app does not request the Android Internet permission.
The developer does not receive, collect, sell, or share your scanned content, selected images, history, settings, or whitelist data.
Data can leave your device only when you choose an Android or third-party action, such as Open, Share, Call, SMS, Email, Add contact, Add calendar event, Wi-Fi settings, or Google Play review. Those actions are handled by Android, Google Play, or the app or service you choose, and their privacy practices apply.
Storage, retention, and deletion
Optional scan history and settings are stored in app-private storage on your device. Android app backup is disabled for this app.
Scan history remains on your device until you delete individual entries, delete all history, turn history off and choose to delete existing history, clear the app data, or uninstall the app.
Settings remain on your device until you change them, clear the app data, or uninstall the app.
Camera frames, selected images, imported whitelist IDs, and batch scan results are not retained by the app after the active use or app session ends, unless the resulting scanned content is saved to local history because you enabled that setting.
Security
The app relies on Android app-private storage and Android permission controls. Keep your device screen lock and operating system security updates enabled to protect local data.
Children
The app is not directed to children and does not knowingly collect personal data from anyone.
Changes
If this policy changes, the updated policy will be included in the app and in the public policy copy for the app.
Contact
For privacy questions or deletion requests about data that may have been sent through an external action you chose, contact the relevant external service. For questions about this app, contact SoftwareApp-HB at softwareapp.hb@gmail.com.
+3 -1
View File
@@ -6,7 +6,8 @@
<string name="settings">Einstellungen</string> <string name="settings">Einstellungen</string>
<string name="save_history">Historie speichern (lokal)</string> <string name="save_history">Historie speichern (lokal)</string>
<string name="privacy">Datenschutz</string> <string name="privacy">Datenschutz</string>
<string name="privacy_text">Keine Datenübertragung, keine Werbung, kein Tracking.</string> <string name="privacy_policy">Datenschutzerklärung</string>
<string name="privacy_text">Lokale Verarbeitung, keine Werbung, kein Tracking. Details stehen in der Datenschutzerklärung.</string>
<string name="security_warnings">Sicherheitswarnungen</string> <string name="security_warnings">Sicherheitswarnungen</string>
<string name="scan_feedback">Scan-Feedback (Ton + Vibration)</string> <string name="scan_feedback">Scan-Feedback (Ton + Vibration)</string>
<string name="about">Über</string> <string name="about">Über</string>
@@ -19,6 +20,7 @@
<string name="delete_all">Alles löschen</string> <string name="delete_all">Alles löschen</string>
<string name="confirm_delete_all">Alle Historie-Einträge löschen?</string> <string name="confirm_delete_all">Alle Historie-Einträge löschen?</string>
<string name="confirm">Bestätigen</string> <string name="confirm">Bestätigen</string>
<string name="close">Schließen</string>
<string name="search">Suchen</string> <string name="search">Suchen</string>
<string name="flashlight">Taschenlampe</string> <string name="flashlight">Taschenlampe</string>
<string name="camera_permission_title">Kamerazugriff erforderlich</string> <string name="camera_permission_title">Kamerazugriff erforderlich</string>
+3 -1
View File
@@ -6,7 +6,8 @@
<string name="settings">Settings</string> <string name="settings">Settings</string>
<string name="save_history">Save history (local)</string> <string name="save_history">Save history (local)</string>
<string name="privacy">Privacy</string> <string name="privacy">Privacy</string>
<string name="privacy_text">No data transfer, no ads, no tracking.</string> <string name="privacy_policy">Privacy Policy</string>
<string name="privacy_text">Local processing, no ads, no tracking. See the privacy policy for details.</string>
<string name="security_warnings">Security warnings</string> <string name="security_warnings">Security warnings</string>
<string name="scan_feedback">Scan feedback (beep + haptic)</string> <string name="scan_feedback">Scan feedback (beep + haptic)</string>
<string name="about">About</string> <string name="about">About</string>
@@ -19,6 +20,7 @@
<string name="delete_all">Delete all</string> <string name="delete_all">Delete all</string>
<string name="confirm_delete_all">Delete all history entries?</string> <string name="confirm_delete_all">Delete all history entries?</string>
<string name="confirm">Confirm</string> <string name="confirm">Confirm</string>
<string name="close">Close</string>
<string name="search">Search</string> <string name="search">Search</string>
<string name="flashlight">Flashlight</string> <string name="flashlight">Flashlight</string>
<string name="camera_permission_title">Camera access required</string> <string name="camera_permission_title">Camera access required</string>