Leitfaden zur Anpassung der Speicherberechtigungen für Android 11+

Mit KI zusammenfassen

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_STORAGE
  • WRITE_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_STORAGE Ist veraltet und praktisch nutzlos auf neueren Android-Versionen
  • Wenn Sie hinzufügen maxSdkVersion=32 Diese 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_SPEICHER wo 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_SPEICHER Das 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_STORAGE
    • WRITE_EXTERNAL_STORAGE
  • Verhalten:
    • Apps können frei darauf zugreifen /sdcard und seine Unterverzeichnisse
    • Von der App erstellte Dateien bleiben auch nach der Deinstallation der App auf dem Gerät erhalten.
  • Typische Vorgehensweise:
    • Direktes Lesen/Schreiben unter externen Speicherpfaden

Android 10 (API 29) – Einführung von Scoped Storage

  • Berechtigungen:
    • READ_EXTERNAL_STORAGE Funktioniert immer noch
    • WRITE_EXTERNAL_STORAGE Existiert 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.
    • Mediendateien (Bilder, Videos, Audio) sollten über folgende Methode aufgerufen werden: MediaStore
    • requestLegacyExternalStorage=true könnte das alte Verhalten vorübergehend aufrechterhalten
      (Dieses Flag wird jedoch ab Android 11 ignoriert.)
  • Empfohlene Vorgehensweise:
    • Für Bilder/Videos/Audio: verwenden Sie MediaStore
    • Für private Dateien: verwenden getExternalFilesDir() oder getDataDir()

Android 11 (API 30) – Scoped Storage erzwungen

  • Berechtigungen:
    • READ_EXTERNAL_STORAGE Funktioniert, aber nur für Medien, die von MediaStore verwaltet werden.
    • WRITE_EXTERNAL_STORAGE ist effektiv veraltet für allgemeine externe Speicherung
    • VERWALTEN_EXTERNEN_SPEICHER eingeführt für spezielle Anwendungsfälle mit “Zugriff auf alle Dateien”.
  • Verhalten:
    • requestLegacyExternalStorage=true Funktioniert 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
    • Nur berücksichtigen VERWALTEN_EXTERNEN_SPEICHER wenn Ihre App tatsächlich ein Dateimanager, ein Backup-Tool, eine Sicherheits-App usw. ist.

Android 13 (API 33) – Aufteilung der Medienberechtigungen

  • Berechtigungen:
    • LESEMEDIA-BILDER – Zugriff auf Bilder
    • LESEN SIE DAS MEDIENVIDEO – Zugriff auf Videos
    • LESEMEDIA-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.
  • Empfohlene Vorgehensweise:
    • Fordern Sie die benötigten spezifischen Medienberechtigungen an:
      • Wenn Sie beispielsweise nur mit Bildern arbeiten, fordern Sie nur LESEMEDIA-BILDER
    • Tun nicht Anfrage READ_EXTERNAL_STORAGE auf Android 13+, da es durch die neuen Medienberechtigungen ersetzt wurde

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)
  • Android 11
    • Scoped Storage wird erzwungen, Legacy-Switches werden entfernt
    • VERWALTEN_EXTERNEN_SPEICHER erscheint, ist aber stark eingeschränkt
  • Android 13
    • Medienzugang aufgeteilt in READMEDIA* Berechtigungen
    • Gleiche Regeln für den Speicherbereich, aber feinere Benutzersteuerung

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“ /sdcard Zugang"”
  • Behandeln VERWALTEN_EXTERNEN_SPEICHER als 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.

Über den Autor

Beitrag teilen:

Bleiben Sie in Verbindung

Weitere Updates