Als ich versuchte, eine sehr einfache Anforderung umzusetzen – Laden Sie ein Bild herunter und speichern Sie es im lokalen Speicher. — Zunächst schien alles in Ordnung zu sein.
- Honor (Android 10) – funktioniert
- Redmi (Android 11) – funktioniert
- Xiaomi (Android 13) – funktioniert
- Samsung (Android 13) – komplett gescheitert: Der Dialog zur Speicherberechtigung wurde nie angezeigt.
Derselbe Code, dieselbe Funktion, aber ein Gerät mit Android 13 weigerte sich schlichtweg, die Berechtigungsabfrage anzuzeigen. So wurde aus dieser kleinen Aufgabe, ein Bild herunterzuladen, ein tiefergehender Einblick in … Eingeschränkter Speicherplatz Und VERWALTEN_EXTERNEN_SPEICHER.
Dieser Beitrag fasst zusammen, wie ich die Speicherberechtigungen angepasst habe für Android 11 und höher, und wie ich mit den unterschiedlichen Verhaltensweisen in den verschiedenen Versionen umgehe.
1. Der Fehler: Dialog zur Speicherberechtigung wird nie angezeigt (Samsung Android 13)
Die Anforderung ist unkompliziert:
Laden Sie ein Bild herunter und speichern Sie es auf dem Gerät, damit es in der Galerie angezeigt wird.
Auf meinen drei Testgeräten:
- Honor – Android 10 → OK
- Redmi – Android 11 → OK
- Xiaomi – Android 13 → OK
Aber auf einem Samsung-Gerät mit Android 13, das System Der Dialog zur Speicherberechtigung wurde nie angezeigt., egal wie ich es beantragt habe.



Zuerst dachte ich, es handele sich nur um eine weitere Eigenart des Herstellers, aber nachdem ich die Änderungen der Speicherberechtigungen in den verschiedenen Android-Versionen überprüft hatte, wurde mir klar, dass ich mich auf ein Verhalten verließ, das mit Android 13 faktisch als veraltet galt, als ich SDK 33 als Zielplattform verwendete.
2. Hauptursache: WRITE/READ_EXTERNAL_STORAGE sind in Android 13 (SDK 33) veraltet.
In älteren Android-Versionen konnten wir diese beiden Berechtigungen einfach im Manifest deklarieren:
READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE
und fordern Sie sie dann bei Bedarf zur Laufzeit an.
Auf Android 13 (SDK 33) mit targetSdkVersion = 33, Dieser Ansatz stößt an seine Grenzen:
WRITE_EXTERNAL_STORAGEIst veraltet und praktisch nutzlos auf neueren Android-Versionen- Wenn Sie hinzufügen
maxSdkVersion=32Diese Berechtigungen funktionieren auch unter Android 11/12.
aber sie sind ignoriert auf Android 13 bei Zielversion 33 - Gleichzeitig verlangt der Play Store, dass neue Apps mindestens SDK 33 unterstützen.
Für Android 11+ müssen wir uns also an Folgendes anpassen:
- Eingeschränkter Speicherplatz
- Und in einigen Fällen die Sondergenehmigung:
VERWALTEN_EXTERNEN_SPEICHER
VERWALTEN_EXTERNEN_SPEICHER Gewährt einer App umfassenden Zugriff auf alle Inhalte des gemeinsam genutzten Speichers (einschließlich Nicht-Mediendateien). nicht Der Zugriff auf die privaten Verzeichnisse anderer Apps wird zwar ermöglicht, von Google Play jedoch weiterhin als eine äußerst sensible Berechtigung eingestuft.
Um verschiedene Android-Versionen zu unterstützen, habe ich die Berechtigungsverwaltung schließlich aufgeteilt in:
- Vor Android 11 (API < 30) – Berechtigungen für externen Speicher im alten Stil
- Android 11 und höher – Eingeschränkte Lagerung + Sonderbehandlung mit
VERWALTEN_EXTERNEN_SPEICHERwo unbedingt erforderlich
3. Schrittweise Anpassung
3.1 MANAGE_EXTERNAL_STORAGE im Manifest deklarieren
Im AndroidManifest.xml:
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />⚠️ Hinweis: Weil
VERWALTEN_EXTERNEN_SPEICHERDas ist eine sensible Berechtigung und daher im Google Play Store eingeschränkt. Ich werde später auf Alternativen eingehen, falls Sie nur Bilder speichern möchten.
3.2 Prüfen, ob die Genehmigung erteilt wurde
Ich habe verwendet EasyPermissions um die Berechtigungsprüfungen zu vereinfachen.
private fun checkPer(activity: PreViewActivity): Boolean { return if (Build.VERSION.SDK_INT >= 30) { EasyPermissions.hasPermissions( activity, android.Manifest.permission.MANAGE_EXTERNAL_STORAGE ) } else { EasyPermissions.hasPermissions( activity, android.Manifest.permission.WRITE_EXTERNAL_STORAGE ) } }
- An Android 11+ (API >= 30)Ich überprüfe
VERWALTEN_EXTERNEN_SPEICHER - An Android 10 und älterIch überprüfe es immer noch.
WRITE_EXTERNAL_STORAGE
Diese Aufteilung ist entscheidend, denn WRITE_EXTERNAL_STORAGE Verhält sich nicht mehr so wie in neueren Versionen.
3.3 Berechtigung anfordern, wenn sie fehlt
Wird die Berechtigung nicht erteilt, formuliere ich sie je nach Systemversion unterschiedlich.
private fun requestStoragePermission(activity: PreViewActivity, curImg: Int) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Android 11+ – Weiterleitung zur Systemeinstellungsseite "Zugriff auf alle Dateien" val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) intent.data = Uri.parse("package:" + activity.packageName) activity.startActivityForResult(intent, 200) } else { // Android 10 und älter – normale Laufzeitberechtigung val perm = android.Manifest.permission.WRITE_EXTERNAL_STORAGE PaperThreeVariable.isToRequestPer = true EasyPermissions.requestPermissions( PermissionRequest.Builder( activity, 200, perm ).build() ) } }
- An Android 11+Man kann nicht einfach einen normalen Laufzeitdialog “poppen” für
VERWALTEN_EXTERNEN_SPEICHER
Sie müssen den Benutzer auf die Seite mit den Systemeinstellungen weiterleiten, wo er manuell den Zugriff auf “Alle Dateien” gewähren muss. - An Android 10 und älterDer klassische Dialog zur Laufzeitberechtigung funktioniert weiterhin.
3.4 Berechtigungs-Callbacks verarbeiten
EasyPermissions hilft dabei, die Callback-Funktion der Activity mit unserer eigenen Logik zu verbinden:
override fun onRequestPermissionsResult( requestCode: Int, permissions: Array , grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) } override fun onPermissionsGranted(requestCode: Int, perms: MutableList ) { AppInitUtils().saveFreshAppImageToGallery(this, curImg) PaperThreeVariable.isToRequestPer = false } override fun onPermissionsDenied(requestCode: Int, perms: MutableList ) { PaperThreeVariable.isToRequestPer = false if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { AppSettingsDialog.Builder(this) .setRationale("Diese Funktion benötigt Speicherberechtigungen") .setNegativeButton("Nein") .setPositiveButton("Ja") .build() .show() } }
Warum ich hier EasyPermissions verwende:
- Benutzer können dauerhaft verweigern Berechtigungen, die dazu führen, dass wiederholte Anfragen stillschweigend fehlschlagen
- EasyPermissions erleichtert Folgendes:
- “Dauerhaft abgelehnt”-Status erkennen
- Zeigen Sie einen Dialog an, der die Benutzer anleitet zu Systemeinstellungen → App-Berechtigungen manuellen Speicherzugriff aktivieren
Sobald die Genehmigung erteilt ist, rufe ich an:
AppInitUtils().saveFreshAppImageToGallery(this, curImg)
um das Bild tatsächlich zu speichern und die Galerie zu aktualisieren.
Nach dieser Anpassung verhielt sich das Samsung Android 13-Gerät schließlich genauso wie die anderen.
Anmerkung am Rande: Mein Xiaomi-Gerät wurde als Android 13 gemeldet, aber die “historisch verbundenen Geräte” von Android Studio erkannten es als Android 12. Das könnte erklären, warum es in einigen Fällen trotzdem funktionierte – aber genau deshalb ist eine versionsabhängige Berechtigungsverwaltung so wichtig.
4. Informationen zu MANAGE_EXTERNAL_STORAGE und Google Play-Einschränkungen
VERWALTEN_EXTERNEN_SPEICHER ist mächtig:
Es gewährt Lese-/Schreibzugriff auf alle gemeinsam genutzten Speicher auf dem Gerät.
Aus diesem Grund behandelt Google Play es als hochsensible Genehmigung:
- Es ist hauptsächlich gedacht für Dateimanager / Datensicherung / Virenschutz Apps vom Typ „Apps“
- Sie müssen eine Begründung für die Nutzung einreichen.
- Wenn es sich bei Ihrer App lediglich um eine typische Verbraucher-App handelt (z. B. zum Speichern von Bildern, für einfache Downloads), wird Ihre Anfrage höchstwahrscheinlich lauten: abgelehnt
Wenn Ihre einzige Anforderung also lautet:
“Speichere ein Bild in der Galerie und mach es für den Benutzer sichtbar.”
dann solltest du dringend davon abraten VERWALTEN_EXTERNEN_SPEICHER und stattdessen:
- Verwenden MediaStore um Bilder in die Systemmedienbibliothek einzufügen
- Oder verwenden Sie APIs, die Bilder speichern können, ohne dass vollständiger Dateizugriff erforderlich ist.
Es gibt mehrere Muster:
- Speichern Sie ein Bild im Verzeichnis Pictures/DCIM.
- Benachrichtigen Sie den Medienscanner oder nutzen Sie MediaStore, damit die Galerie die Datei erkennen kann.
- Tun Sie all dies ohne MANAGE_EXTERNAL_STORAGE anzufordern
Für den internen Vertrieb oder den Vertrieb außerhalb des Play Stores (z. B. interne App-Stores von Unternehmen) können Sie technisch gesehen weiterhin verwenden Environment.getExternalStorageDirectory(), Ich würde jedoch nicht empfehlen, im Jahr 2025 eine neue App auf dieser Grundlage zu entwickeln.
5. Versionsübersicht (Android 9 → 13)
Um alles übersichtlich darzustellen, folgt hier eine allgemeine Zusammenfassung, wie sich externer Speicher und Berechtigungen in den verschiedenen Versionen verhalten.
Android 9 und älter (API 28 und früher)
- Berechtigungen:
READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE
- Verhalten:
- Apps können frei darauf zugreifen
/sdcardund seine Unterverzeichnisse - Von der App erstellte Dateien bleiben auch nach der Deinstallation der App auf dem Gerät erhalten.
- Apps können frei darauf zugreifen
- Typische Vorgehensweise:
- Direktes Lesen/Schreiben unter externen Speicherpfaden
Android 10 (API 29) – Einführung von Scoped Storage
- Berechtigungen:
READ_EXTERNAL_STORAGEFunktioniert immer nochWRITE_EXTERNAL_STORAGEExistiert noch immer, aber sein effektiver Wirkungsbereich ist reduziert
- Verhalten:
- Eingeschränkter Speicherplatz wird vorgestellt:
- Apps sind auf ihr eigenes app-spezifisches Verzeichnis beschränkt unter
Android/data/your.package.name/ - Der direkte Zugriff auf Dateien anderer Apps ist eingeschränkt.
- Apps sind auf ihr eigenes app-spezifisches Verzeichnis beschränkt unter
- Mediendateien (Bilder, Videos, Audio) sollten über folgende Methode aufgerufen werden: MediaStore
requestLegacyExternalStorage=truekönnte das alte Verhalten vorübergehend aufrechterhalten
(Dieses Flag wird jedoch ab Android 11 ignoriert.)
- Eingeschränkter Speicherplatz wird vorgestellt:
- Empfohlene Vorgehensweise:
- Für Bilder/Videos/Audio: verwenden Sie MediaStore
- Für private Dateien: verwenden
getExternalFilesDir()odergetDataDir()
Android 11 (API 30) – Scoped Storage erzwungen
- Berechtigungen:
READ_EXTERNAL_STORAGEFunktioniert, aber nur für Medien, die von MediaStore verwaltet werden.WRITE_EXTERNAL_STORAGEist effektiv veraltet für allgemeine externe SpeicherungVERWALTEN_EXTERNEN_SPEICHEReingeführt für spezielle Anwendungsfälle mit “Zugriff auf alle Dateien”.
- Verhalten:
requestLegacyExternalStorage=trueFunktioniert nicht mehr; Scoped Storage ist immer eingeschaltet- Zugang zu
/sdcard/Root ist blockiert - Apps können nur:
- Greifen Sie auf deren private Verzeichnisse zu
- Zugriff auf freigegebene Medien über MediaStore
- Empfohlene Vorgehensweise:
- Für typische Apps:
- Verwenden Sie MediaStore oder SAF (
AKTION_DOKUMENT_ÖFFNEN,AKTION_DOKUMENT_ERSTELLEN) für vom Benutzer ausgewählte Dateien
- Verwenden Sie MediaStore oder SAF (
- Nur berücksichtigen
VERWALTEN_EXTERNEN_SPEICHERwenn Ihre App tatsächlich ein Dateimanager, ein Backup-Tool, eine Sicherheits-App usw. ist.
- Für typische Apps:
Android 13 (API 33) – Aufteilung der Medienberechtigungen
- Berechtigungen:
LESEMEDIA-BILDER– Zugriff auf BilderLESEN SIE DAS MEDIENVIDEO– Zugriff auf VideosLESEMEDIA-AUDIO– Zugriff auf Audio
- Verhalten:
- Medienrechte sind feinkörnig:
- Benutzer können beispielsweise nur den Zugriff auf Bilder, nur den Zugriff auf Videos usw. gewähren.
- Die Regeln für den eingeschränkten Speicherbereich aus Android 11 bleiben bestehen.
- Medienrechte sind feinkörnig:
- Empfohlene Vorgehensweise:
- Fordern Sie die benötigten spezifischen Medienberechtigungen an:
- Wenn Sie beispielsweise nur mit Bildern arbeiten, fordern Sie nur
LESEMEDIA-BILDER
- Wenn Sie beispielsweise nur mit Bildern arbeiten, fordern Sie nur
- Tun nicht Anfrage
READ_EXTERNAL_STORAGEauf Android 13+, da es durch die neuen Medienberechtigungen ersetzt wurde
- Fordern Sie die benötigten spezifischen Medienberechtigungen an:
Schnellmatrix (Konzeptionell)
- Android 9 und älter
- Der Zugriff auf externen Speicher ist weitreichend und wird durch READ/WRITE_EXTERNAL_STORAGE gesteuert.
- Android 10
- Scoped Storage wurde eingeführt, aber es gibt Auswege (
Anfrage an LegacyExternenSpeicher)
- Scoped Storage wurde eingeführt, aber es gibt Auswege (
- Android 11
- Scoped Storage wird erzwungen, Legacy-Switches werden entfernt
VERWALTEN_EXTERNEN_SPEICHERerscheint, ist aber stark eingeschränkt
- Android 13
- Medienzugang aufgeteilt in
READMEDIA*Berechtigungen - Gleiche Regeln für den Speicherbereich, aber feinere Benutzersteuerung
- Medienzugang aufgeteilt in
6. Fazit
- Gehen Sie nicht davon aus, dass “es auf einem Android 13-Gerät funktioniert” bedeutet, dass es überall funktioniert; OEM- und Systemberichte können inkonsistent sein.
- Für Android 11+, Denken Sie in folgenden Kategorien:
- App-Verzeichnisse + MediaStore + SAF, nicht “roh“
/sdcardZugang"”
- App-Verzeichnisse + MediaStore + SAF, nicht “roh“
- Behandeln
VERWALTEN_EXTERNEN_SPEICHERals letzter Ausweg für ganz bestimmte App-Typen, insbesondere wenn Sie planen, auf Google Play zu veröffentlichen. - Immer testen auf mehrere Geräte und Android-Versionen, insbesondere wenn es um Berechtigungen und Speicherplatz geht.
Dieser Artikel basiert auf meinen eigenen Erfahrungen mit Fehlersuche und Anpassung in realen Android-Projekten (darunter ein Samsung-Gerät mit Android 13). GPT hat lediglich bei der Übersetzung und sprachlichen Überarbeitung geholfen; alle technischen Inhalte und Entscheidungen stammen von mir.


