{"id":3803,"date":"2025-11-27T18:25:57","date_gmt":"2025-11-27T10:25:57","guid":{"rendered":"https:\/\/imastudio.com\/?p=3803"},"modified":"2025-11-27T18:25:58","modified_gmt":"2025-11-27T10:25:58","slug":"android-storage-permission-adaptation-guide","status":"publish","type":"post","link":"https:\/\/imastudio.com\/de\/blog\/android-storage-permission-adaptation-guide","title":{"rendered":"Leitfaden zur Anpassung der Speicherberechtigungen f\u00fcr Android 11+"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Als ich versuchte, eine sehr einfache Anforderung umzusetzen \u2013 <strong>Laden Sie ein Bild herunter und speichern Sie es im lokalen Speicher.<\/strong> \u2014 Zun\u00e4chst schien alles in Ordnung zu sein.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Honor (Android 10) \u2013 funktioniert<\/li>\n\n\n\n<li>Redmi (Android 11) \u2013 funktioniert<\/li>\n\n\n\n<li>Xiaomi (Android 13) \u2013 funktioniert<\/li>\n\n\n\n<li><strong>Samsung (Android 13)<\/strong> \u2013 komplett gescheitert: Der Dialog zur Speicherberechtigung wurde nie angezeigt.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Derselbe Code, dieselbe Funktion, aber ein Ger\u00e4t mit Android 13 weigerte sich schlichtweg, die Berechtigungsabfrage anzuzeigen. So wurde aus dieser kleinen Aufgabe, ein Bild herunterzuladen, ein tiefergehender Einblick in \u2026 <strong>Eingeschr\u00e4nkter Speicherplatz<\/strong> Und <strong>VERWALTEN_EXTERNEN_SPEICHER<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Beitrag fasst zusammen, wie ich die Speicherberechtigungen angepasst habe f\u00fcr <strong>Android 11 und h\u00f6her<\/strong>, und wie ich mit den unterschiedlichen Verhaltensweisen in den verschiedenen Versionen umgehe.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Der Fehler: Dialog zur Speicherberechtigung wird nie angezeigt (Samsung Android 13)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Anforderung ist unkompliziert:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Laden Sie ein Bild herunter und speichern Sie es auf dem Ger\u00e4t, damit es in der Galerie angezeigt wird.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Auf meinen drei Testger\u00e4ten:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Honor \u2013 Android 10 \u2192 OK<\/li>\n\n\n\n<li>Redmi \u2013 Android 11 \u2192 OK<\/li>\n\n\n\n<li>Xiaomi \u2013 Android 13 \u2192 OK<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Aber auf einem <strong>Samsung-Ger\u00e4t mit Android 13<\/strong>, das System <strong>Der Dialog zur Speicherberechtigung wurde nie angezeigt.<\/strong>, egal wie ich es beantragt habe.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"184\" src=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-1024x184.jpeg\" alt=\"\" class=\"wp-image-3810\" srcset=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-1024x184.jpeg 1024w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-300x54.jpeg 300w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-768x138.jpeg 768w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-18x3.jpeg 18w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134.jpeg 1277w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"168\" src=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-1024x168.jpeg\" alt=\"\" class=\"wp-image-3811\" srcset=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-1024x168.jpeg 1024w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-300x49.jpeg 300w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-768x126.jpeg 768w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-1536x253.jpeg 1536w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-18x3.jpeg 18w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139.jpeg 1806w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"174\" src=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-1024x174.jpeg\" alt=\"\" class=\"wp-image-3808\" srcset=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-1024x174.jpeg 1024w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-300x51.jpeg 300w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-768x131.jpeg 768w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-1536x262.jpeg 1536w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-18x3.jpeg 18w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150.jpeg 1879w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zuerst dachte ich, es handele sich nur um eine weitere Eigenart des Herstellers, aber nachdem ich die \u00c4nderungen der Speicherberechtigungen in den verschiedenen Android-Versionen \u00fcberpr\u00fcft hatte, wurde mir klar, dass ich mich auf ein Verhalten verlie\u00df, das mit Android 13 faktisch als veraltet galt, als ich SDK 33 als Zielplattform verwendete.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. Hauptursache: WRITE\/READ_EXTERNAL_STORAGE sind in Android 13 (SDK 33) veraltet.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In \u00e4lteren Android-Versionen konnten wir diese beiden Berechtigungen einfach im Manifest deklarieren:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>READ_EXTERNAL_STORAGE<\/code><\/li>\n\n\n\n<li><code>WRITE_EXTERNAL_STORAGE<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">und fordern Sie sie dann bei Bedarf zur Laufzeit an.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Auf Android 13 (SDK 33) mit <strong>targetSdkVersion = 33<\/strong>, Dieser Ansatz st\u00f6\u00dft an seine Grenzen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>WRITE_EXTERNAL_STORAGE<\/code> Ist <strong>veraltet und praktisch nutzlos<\/strong> auf neueren Android-Versionen<\/li>\n\n\n\n<li>Wenn Sie hinzuf\u00fcgen <code>maxSdkVersion=32<\/code> Diese Berechtigungen funktionieren auch unter Android 11\/12.<br>aber sie sind <strong>ignoriert<\/strong> auf Android 13 bei Zielversion 33<\/li>\n\n\n\n<li>Gleichzeitig verlangt der Play Store, dass neue Apps mindestens SDK 33 unterst\u00fctzen.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr Android 11+ m\u00fcssen wir uns also an Folgendes anpassen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Eingeschr\u00e4nkter Speicherplatz<\/strong><\/li>\n\n\n\n<li>Und in einigen F\u00e4llen die Sondergenehmigung: <code>VERWALTEN_EXTERNEN_SPEICHER<\/code><\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>VERWALTEN_EXTERNEN_SPEICHER<\/strong> Gew\u00e4hrt einer App umfassenden Zugriff auf alle Inhalte des gemeinsam genutzten Speichers (einschlie\u00dflich Nicht-Mediendateien). <strong>nicht<\/strong> Der Zugriff auf die privaten Verzeichnisse anderer Apps wird zwar erm\u00f6glicht, von Google Play jedoch weiterhin als eine \u00e4u\u00dferst sensible Berechtigung eingestuft.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Um verschiedene Android-Versionen zu unterst\u00fctzen, habe ich die Berechtigungsverwaltung schlie\u00dflich aufgeteilt in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Vor Android 11 (API &lt; 30)<\/strong> \u2013 Berechtigungen f\u00fcr externen Speicher im alten Stil<\/li>\n\n\n\n<li><strong>Android 11 und h\u00f6her<\/strong> \u2013 Eingeschr\u00e4nkte Lagerung + Sonderbehandlung mit <code>VERWALTEN_EXTERNEN_SPEICHER<\/code> wo unbedingt erforderlich<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Schrittweise Anpassung<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 MANAGE_EXTERNAL_STORAGE im Manifest deklarieren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Im <code>AndroidManifest.xml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;uses-permission\n    android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\"\n    tools:ignore=\"ScopedStorage\" \/><\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f Hinweis: Weil <code>VERWALTEN_EXTERNEN_SPEICHER<\/code> Das ist eine sensible Berechtigung und daher im Google Play Store eingeschr\u00e4nkt. Ich werde sp\u00e4ter auf Alternativen eingehen, falls Sie nur Bilder speichern m\u00f6chten.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Pr\u00fcfen, ob die Genehmigung erteilt wurde<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ich habe verwendet <strong>EasyPermissions<\/strong> um die Berechtigungspr\u00fcfungen zu vereinfachen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>private fun checkPer(activity: PreViewActivity): Boolean { return if (Build.VERSION.SDK_INT &gt;= 30) { EasyPermissions.hasPermissions( activity, android.Manifest.permission.MANAGE_EXTERNAL_STORAGE ) } else { EasyPermissions.hasPermissions( activity, android.Manifest.permission.WRITE_EXTERNAL_STORAGE ) } }\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>An <strong>Android 11+ (API &gt;= 30)<\/strong>Ich \u00fcberpr\u00fcfe <code>VERWALTEN_EXTERNEN_SPEICHER<\/code><\/li>\n\n\n\n<li>An <strong>Android 10 und \u00e4lter<\/strong>Ich \u00fcberpr\u00fcfe es immer noch. <code>WRITE_EXTERNAL_STORAGE<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Aufteilung ist entscheidend, denn <code>WRITE_EXTERNAL_STORAGE<\/code> Verh\u00e4lt sich nicht mehr so wie in neueren Versionen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.3 Berechtigung anfordern, wenn sie fehlt<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wird die Berechtigung nicht erteilt, formuliere ich sie je nach Systemversion unterschiedlich.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>private fun requestStoragePermission(activity: PreViewActivity, curImg: Int) { if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.R) { \/\/ Android 11+ \u2013 Weiterleitung zur Systemeinstellungsseite \"Zugriff auf alle Dateien\" val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) intent.data = Uri.parse(&quot;package:&quot; + activity.packageName) activity.startActivityForResult(intent, 200) } else { \/\/ Android 10 und \u00e4lter \u2013 normale Laufzeitberechtigung val perm = android.Manifest.permission.WRITE_EXTERNAL_STORAGE PaperThreeVariable.isToRequestPer = true EasyPermissions.requestPermissions( PermissionRequest.Builder( activity, 200, perm ).build() ) } }\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>An <strong>Android 11+<\/strong>Man kann nicht einfach einen normalen Laufzeitdialog \u201cpoppen\u201d f\u00fcr <code>VERWALTEN_EXTERNEN_SPEICHER<\/code><br>Sie m\u00fcssen den Benutzer auf die Seite mit den Systemeinstellungen weiterleiten, wo er manuell den Zugriff auf \u201cAlle Dateien\u201d gew\u00e4hren muss.<\/li>\n\n\n\n<li>An <strong>Android 10 und \u00e4lter<\/strong>Der klassische Dialog zur Laufzeitberechtigung funktioniert weiterhin.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.4 Berechtigungs-Callbacks verarbeiten<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">EasyPermissions hilft dabei, die Callback-Funktion der Activity mit unserer eigenen Logik zu verbinden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>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(&quot;Diese Funktion ben\u00f6tigt Speicherberechtigungen&quot;) .setNegativeButton(&quot;Nein&quot;) .setPositiveButton(&quot;Ja&quot;) .build() .show() } }\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Warum ich hier EasyPermissions verwende:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Benutzer k\u00f6nnen <strong>dauerhaft verweigern<\/strong> Berechtigungen, die dazu f\u00fchren, dass wiederholte Anfragen stillschweigend fehlschlagen<\/li>\n\n\n\n<li>EasyPermissions erleichtert Folgendes:\n<ul class=\"wp-block-list\">\n<li>\u201cDauerhaft abgelehnt\u201d-Status erkennen<\/li>\n\n\n\n<li>Zeigen Sie einen Dialog an, der die Benutzer anleitet zu <strong>Systemeinstellungen \u2192 App-Berechtigungen<\/strong> manuellen Speicherzugriff aktivieren<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Sobald die Genehmigung erteilt ist, rufe ich an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AppInitUtils().saveFreshAppImageToGallery(this, curImg)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">um das Bild tats\u00e4chlich zu speichern und die Galerie zu aktualisieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach dieser Anpassung verhielt sich das Samsung Android 13-Ger\u00e4t schlie\u00dflich genauso wie die anderen.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Anmerkung am Rande: Mein Xiaomi-Ger\u00e4t wurde als Android 13 gemeldet, aber die \u201chistorisch verbundenen Ger\u00e4te\u201d von Android Studio erkannten es als Android 12. Das k\u00f6nnte erkl\u00e4ren, warum es in einigen F\u00e4llen trotzdem funktionierte \u2013 aber genau deshalb ist eine versionsabh\u00e4ngige Berechtigungsverwaltung so wichtig.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Informationen zu MANAGE_EXTERNAL_STORAGE und Google Play-Einschr\u00e4nkungen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>VERWALTEN_EXTERNEN_SPEICHER<\/code> ist m\u00e4chtig:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Es gew\u00e4hrt Lese-\/Schreibzugriff auf <strong>alle gemeinsam genutzten Speicher<\/strong> auf dem Ger\u00e4t.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Aus diesem Grund behandelt Google Play es als <strong>hochsensible Genehmigung<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Es ist haupts\u00e4chlich gedacht f\u00fcr <strong>Dateimanager \/ Datensicherung \/ Virenschutz<\/strong> Apps vom Typ \u201eApps\u201c<\/li>\n\n\n\n<li>Sie m\u00fcssen eine Begr\u00fcndung f\u00fcr die Nutzung einreichen.<\/li>\n\n\n\n<li>Wenn es sich bei Ihrer App lediglich um eine typische Verbraucher-App handelt (z. B. zum Speichern von Bildern, f\u00fcr einfache Downloads), wird Ihre Anfrage h\u00f6chstwahrscheinlich lauten: <strong>abgelehnt<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn Ihre einzige Anforderung also lautet:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cSpeichere ein Bild in der Galerie und mach es f\u00fcr den Benutzer sichtbar.\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">dann solltest du <strong>dringend davon abraten<\/strong> <code>VERWALTEN_EXTERNEN_SPEICHER<\/code> und stattdessen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Verwenden <strong>MediaStore<\/strong> um Bilder in die Systemmedienbibliothek einzuf\u00fcgen<\/li>\n\n\n\n<li>Oder verwenden Sie APIs, die Bilder speichern k\u00f6nnen, ohne dass vollst\u00e4ndiger Dateizugriff erforderlich ist.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Es gibt mehrere Muster:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Speichern Sie ein Bild im Verzeichnis Pictures\/DCIM.<\/li>\n\n\n\n<li>Benachrichtigen Sie den Medienscanner oder nutzen Sie MediaStore, damit die Galerie die Datei erkennen kann.<\/li>\n\n\n\n<li>Tun Sie all dies <strong>ohne MANAGE_EXTERNAL_STORAGE anzufordern<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr den internen Vertrieb oder den Vertrieb au\u00dferhalb des Play Stores (z. B. interne App-Stores von Unternehmen) k\u00f6nnen Sie technisch gesehen weiterhin verwenden <code>Environment.getExternalStorageDirectory()<\/code>, Ich w\u00fcrde jedoch nicht empfehlen, im Jahr 2025 eine neue App auf dieser Grundlage zu entwickeln.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Versions\u00fcbersicht (Android 9 \u2192 13)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Um alles \u00fcbersichtlich darzustellen, folgt hier eine allgemeine Zusammenfassung, wie sich externer Speicher und Berechtigungen in den verschiedenen Versionen verhalten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Android 9 und \u00e4lter (API 28 und fr\u00fcher)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Berechtigungen<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>READ_EXTERNAL_STORAGE<\/code><\/li>\n\n\n\n<li><code>WRITE_EXTERNAL_STORAGE<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Verhalten<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Apps k\u00f6nnen frei darauf zugreifen <code>\/sdcard<\/code> und seine Unterverzeichnisse<\/li>\n\n\n\n<li>Von der App erstellte Dateien bleiben auch nach der Deinstallation der App auf dem Ger\u00e4t erhalten.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Typische Vorgehensweise<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Direktes Lesen\/Schreiben unter externen Speicherpfaden<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Android 10 (API 29) \u2013 Einf\u00fchrung von Scoped Storage<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Berechtigungen<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>READ_EXTERNAL_STORAGE<\/code> Funktioniert immer noch<\/li>\n\n\n\n<li><code>WRITE_EXTERNAL_STORAGE<\/code> Existiert noch immer, aber sein effektiver Wirkungsbereich ist reduziert<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Verhalten<\/strong>:\n<ul class=\"wp-block-list\">\n<li><strong>Eingeschr\u00e4nkter Speicherplatz<\/strong> wird vorgestellt:\n<ul class=\"wp-block-list\">\n<li>Apps sind auf ihr eigenes app-spezifisches Verzeichnis beschr\u00e4nkt unter<br><code>Android\/data\/your.package.name\/<\/code><\/li>\n\n\n\n<li>Der direkte Zugriff auf Dateien anderer Apps ist eingeschr\u00e4nkt.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Mediendateien (Bilder, Videos, Audio) sollten \u00fcber folgende Methode aufgerufen werden: <strong>MediaStore<\/strong><\/li>\n\n\n\n<li><code>requestLegacyExternalStorage=true<\/code> k\u00f6nnte das alte Verhalten vor\u00fcbergehend aufrechterhalten<br>(Dieses Flag wird jedoch ab Android 11 ignoriert.)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Empfohlene Vorgehensweise<\/strong>:\n<ul class=\"wp-block-list\">\n<li>F\u00fcr Bilder\/Videos\/Audio: verwenden Sie <strong>MediaStore<\/strong><\/li>\n\n\n\n<li>F\u00fcr private Dateien: verwenden <code>getExternalFilesDir()<\/code> oder <code>getDataDir()<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Android 11 (API 30) \u2013 Scoped Storage erzwungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Berechtigungen<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>READ_EXTERNAL_STORAGE<\/code> Funktioniert, aber nur f\u00fcr Medien, die von MediaStore verwaltet werden.<\/li>\n\n\n\n<li><code>WRITE_EXTERNAL_STORAGE<\/code> ist effektiv <strong>veraltet<\/strong> f\u00fcr allgemeine externe Speicherung<\/li>\n\n\n\n<li><code>VERWALTEN_EXTERNEN_SPEICHER<\/code> eingef\u00fchrt f\u00fcr spezielle Anwendungsf\u00e4lle mit \u201cZugriff auf alle Dateien\u201d.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Verhalten<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>requestLegacyExternalStorage=true<\/code> Funktioniert nicht mehr; Scoped Storage ist <strong>immer eingeschaltet<\/strong><\/li>\n\n\n\n<li>Zugang zu <code>\/sdcard\/<\/code> Root ist blockiert<\/li>\n\n\n\n<li>Apps k\u00f6nnen nur:\n<ul class=\"wp-block-list\">\n<li>Greifen Sie auf deren private Verzeichnisse zu<\/li>\n\n\n\n<li>Zugriff auf freigegebene Medien \u00fcber <strong>MediaStore<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Empfohlene Vorgehensweise<\/strong>:\n<ul class=\"wp-block-list\">\n<li>F\u00fcr typische Apps:\n<ul class=\"wp-block-list\">\n<li>Verwenden Sie MediaStore oder <strong>SAF<\/strong> (<code>AKTION_DOKUMENT_\u00d6FFNEN<\/code>, <code>AKTION_DOKUMENT_ERSTELLEN<\/code>) f\u00fcr vom Benutzer ausgew\u00e4hlte Dateien<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Nur ber\u00fccksichtigen <code>VERWALTEN_EXTERNEN_SPEICHER<\/code> wenn Ihre App tats\u00e4chlich ein Dateimanager, ein Backup-Tool, eine Sicherheits-App usw. ist.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Android 13 (API 33) \u2013 Aufteilung der Medienberechtigungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Berechtigungen<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>LESEMEDIA-BILDER<\/code> \u2013 Zugriff auf Bilder<\/li>\n\n\n\n<li><code>LESEN SIE DAS MEDIENVIDEO<\/code> \u2013 Zugriff auf Videos<\/li>\n\n\n\n<li><code>LESEMEDIA-AUDIO<\/code> \u2013 Zugriff auf Audio<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Verhalten<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Medienrechte sind <strong>feink\u00f6rnig<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Benutzer k\u00f6nnen beispielsweise nur den Zugriff auf Bilder, nur den Zugriff auf Videos usw. gew\u00e4hren.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Die Regeln f\u00fcr den eingeschr\u00e4nkten Speicherbereich aus Android 11 bleiben bestehen.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Empfohlene Vorgehensweise<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Fordern Sie die ben\u00f6tigten spezifischen Medienberechtigungen an:\n<ul class=\"wp-block-list\">\n<li>Wenn Sie beispielsweise nur mit Bildern arbeiten, fordern Sie nur <code>LESEMEDIA-BILDER<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Tun <strong>nicht<\/strong> Anfrage <code>READ_EXTERNAL_STORAGE<\/code> auf Android 13+, da es durch die neuen Medienberechtigungen ersetzt wurde<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Schnellmatrix (Konzeptionell)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Android 9 und \u00e4lter<\/strong>\n<ul class=\"wp-block-list\">\n<li>Der Zugriff auf externen Speicher ist weitreichend und wird durch READ\/WRITE_EXTERNAL_STORAGE gesteuert.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Android 10<\/strong>\n<ul class=\"wp-block-list\">\n<li>Scoped Storage wurde eingef\u00fchrt, aber es gibt Auswege (<code>Anfrage an LegacyExternenSpeicher<\/code>)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Android 11<\/strong>\n<ul class=\"wp-block-list\">\n<li>Scoped Storage wird erzwungen, Legacy-Switches werden entfernt<\/li>\n\n\n\n<li><code>VERWALTEN_EXTERNEN_SPEICHER<\/code> erscheint, ist aber stark eingeschr\u00e4nkt<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Android 13<\/strong>\n<ul class=\"wp-block-list\">\n<li>Medienzugang aufgeteilt in <code>READMEDIA*<\/code> Berechtigungen<\/li>\n\n\n\n<li>Gleiche Regeln f\u00fcr den Speicherbereich, aber feinere Benutzersteuerung<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. Fazit<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gehen Sie nicht davon aus, dass \u201ces auf einem Android 13-Ger\u00e4t funktioniert\u201d bedeutet, dass es \u00fcberall funktioniert; OEM- und Systemberichte k\u00f6nnen inkonsistent sein.<\/li>\n\n\n\n<li>F\u00fcr <strong>Android 11+<\/strong>, Denken Sie in folgenden Kategorien:\n<ul class=\"wp-block-list\">\n<li><strong>App-Verzeichnisse + MediaStore + SAF<\/strong>, nicht \u201croh\u201c <code>\/sdcard<\/code> Zugang&quot;\u201d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Behandeln <code>VERWALTEN_EXTERNEN_SPEICHER<\/code> als <strong>letzter Ausweg<\/strong> f\u00fcr ganz bestimmte App-Typen, insbesondere wenn Sie planen, auf Google Play zu ver\u00f6ffentlichen.<\/li>\n\n\n\n<li>Immer testen auf <strong>mehrere Ger\u00e4te und Android-Versionen<\/strong>, insbesondere wenn es um Berechtigungen und Speicherplatz geht.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Dieser Artikel basiert auf meinen eigenen Erfahrungen mit Fehlersuche und Anpassung in realen Android-Projekten (darunter ein Samsung-Ger\u00e4t mit Android 13). GPT hat lediglich bei der \u00dcbersetzung und sprachlichen \u00dcberarbeitung geholfen; alle technischen Inhalte und Entscheidungen stammen von mir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/blockquote>","protected":false},"excerpt":{"rendered":"<p>Als ich versuchte, eine sehr einfache Anforderung umzusetzen \u2013 ein Bild herunterzuladen und lokal zu speichern \u2013, schien zun\u00e4chst alles in Ordnung. Derselbe Code, dieselbe Funktion, aber ein Ger\u00e4t mit Android 13 weigerte sich einfach, die Berechtigungsabfrage anzuzeigen. So wurde aus dieser kleinen Aufgabe, ein Bild herunterzuladen, eine tiefgreifende Auseinandersetzung mit [\u2026]<\/p>","protected":false},"author":10,"featured_media":3804,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"","rank_math_description":"","footnotes":""},"categories":[35],"tags":[],"class_list":["post-3803","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-knowledge-hub"],"_links":{"self":[{"href":"https:\/\/imastudio.com\/de\/wp-json\/wp\/v2\/posts\/3803","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/imastudio.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/imastudio.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/imastudio.com\/de\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/imastudio.com\/de\/wp-json\/wp\/v2\/comments?post=3803"}],"version-history":[{"count":4,"href":"https:\/\/imastudio.com\/de\/wp-json\/wp\/v2\/posts\/3803\/revisions"}],"predecessor-version":[{"id":3812,"href":"https:\/\/imastudio.com\/de\/wp-json\/wp\/v2\/posts\/3803\/revisions\/3812"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/imastudio.com\/de\/wp-json\/wp\/v2\/media\/3804"}],"wp:attachment":[{"href":"https:\/\/imastudio.com\/de\/wp-json\/wp\/v2\/media?parent=3803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/imastudio.com\/de\/wp-json\/wp\/v2\/categories?post=3803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/imastudio.com\/de\/wp-json\/wp\/v2\/tags?post=3803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}