Um Nutzern mehr Kontrolle über ihre Dateien zu geben und die Datenflut einzudämmen, wurde in Android 10 ein neues Speicherparadigma für Apps eingeführt, der befristete Speicher. Änderungen am begrenzten Speicher die Art und Weise, wie Apps Dateien im externen Speicher eines Geräts speichern und darauf zugreifen. Um Ihnen zu helfen, Migrieren Sie Ihre App zur Unterstützung von begrenztem Speicher. Folgen Sie dazu den Best Practices für allgemeine die in diesem Leitfaden beschrieben werden. Die Anwendungsfälle sind in zwei Kategorien eingeteilt werden: Umgang mit Mediendateien und Nicht-Mediendateien.
Oft erstellt Ihre App Dateien, auf die andere Apps keinen Zugriff benötigen, oder nicht zugreifen darf. Das System bietet app-spezifische Speicherorte zur Verwaltung solcher Dateien.
Weitere Informationen zum Speichern und Abrufen von Dateien unter Android finden Sie in der Speicherplatz- Schulungsleitfäden.
Mediendateien verarbeiten
In diesem Abschnitt werden einige der gängigen Anwendungsfälle für die Verarbeitung von Mediendateien (Video-, Bild- und Audiodateien) beschrieben. Außerdem wird der allgemeine Ansatz erläutert, den Sie in Ihrer App verwenden können. In der folgenden Tabelle werden diese Anwendungsfälle zusammengefasst und Links genannt. zu jedem der Abschnitte hinzu, die weitere Details enthalten.
Anwendungsfall | Zusammenfassung |
---|---|
Alle Bild- oder Videodateien anzeigen | Verwenden Sie für alle Android-Versionen denselben Ansatz. |
Bilder oder Videos aus einem bestimmten Ordner anzeigen | Verwenden Sie für alle Android-Versionen denselben Ansatz. |
Auf Standortinformationen in Fotos zugreifen | Verwenden Sie einen Ansatz, wenn Ihre App den begrenzten Speicher verwendet. Verwenden Sie einen anderen Ansatz, wenn Sie die Funktion „Begrenzter Speicher“ für Ihre App deaktivieren. |
Speicherort für neue Downloads definieren | Verwenden Sie einen Ansatz, wenn Ihre App den begrenzten Speicher verwendet. Verwenden Sie ein anderes wenn Sie den begrenzten Speicher für Ihre Anwendung deaktivieren. |
Nutzermediendateien auf ein Gerät exportieren | Verwenden Sie für alle Android-Versionen denselben Ansatz. |
Mehrere Mediendateien in einem einzigen Vorgang ändern oder löschen | Verwenden Sie einen Ansatz für Android 11. Unter Android 10 die Option „Bereich“ deaktivieren und verwenden stattdessen den Ansatz für Android 9 und niedriger. |
Importieren Sie ein einzelnes Image, das bereits existiert | Verwenden Sie für alle Android-Versionen denselben Ansatz. |
Einzelbild aufnehmen | Verwenden Sie für alle Android-Versionen die gleiche Herangehensweise. |
Mediendateien mit anderen Apps teilen | Verwenden Sie für alle Android-Versionen denselben Ansatz. |
Mediendateien für eine bestimmte App freigeben | Verwenden Sie für alle Android-Versionen die gleiche Herangehensweise. |
Über Code oder Bibliotheken auf Dateien zugreifen mit direkten Dateipfaden | Verwenden Sie einen Ansatz für Android 11. Deaktivieren Sie bei Android 10 den abgegrenzten Speicher und verwenden Sie stattdessen den Ansatz für Android 9 und niedriger. |
Bild- oder Videodateien aus mehreren Ordnern anzeigen
Mediensammlung abfragen
mit der query()
der API erstellen. Um die Mediendateien zu filtern oder zu sortieren, passe projection
, selection
,
selectionArgs
und sortOrder
.
Bilder oder Videos aus einem bestimmten Ordner anzeigen
Verwenden Sie diesen Ansatz:
- Fordere die Berechtigung
READ_EXTERNAL_STORAGE
gemäß den Best Practices unter App-Berechtigungen anfordern an. - Mediendateien basierend auf dem Wert von abrufen
MediaColumns.DATA
, der den absoluten Dateisystempfad zum Medienelement auf dem Laufwerk enthält.
Hinweis:Wenn Sie auf eine vorhandene Mediendatei zugreifen, können Sie den Wert
von DATA
Spalte in Ihrer Logik. Das liegt daran, dass dieser Wert einen gültigen Dateipfad hat.
Sie können jedoch nicht davon ausgehen, dass die Datei immer verfügbar ist. Bereiten Sie sich darauf vor,
eventuellen dateibasierten E/A-Fehlern.
Verwenden Sie zum Erstellen oder Aktualisieren einer Mediendatei jedoch nicht die Methode
DATA
. Verwenden Sie stattdessen DISPLAY_NAME
und
RELATIVE_PATH
Spalten.
Auf Standortinformationen in Fotos zugreifen
Wenn Ihre App den Speicher mit begrenztem Zugriff verwendet, folgen Sie der Anleitung im Abschnitt Standortinformationen in Fotos des Leitfadens zum Medienspeicher.
Speicherort für neue Downloads festlegen
Wenn Ihre Anwendung begrenzten Speicher verwendet, achten Sie darauf, Mediendateien speichern, die du herunterlädst.
Wenn andere Apps Zugriff auf Dateien benötigen, können Sie für Downloads oder Dokumentensammlungen gut definierte Mediensammlungen verwenden.
Unter Android 11 und höher können andere Apps nicht auf die Dateien in Ihrem externen app-spezifischen Verzeichnis zugreifen, auch wenn Sie diese Dateien mit DownloadManager
abrufen.
Mediendateien von Nutzern auf ein Gerät exportieren
Legen Sie einen geeigneten Standardspeicherort für die Speicherung von Nutzermediendateien fest:
- Sie können Nutzern die Möglichkeit geben, zu entscheiden, ob ihre Mediadateien von anderen Apps gelesen werden können. Verwenden Sie dazu den appspezifischen Speicher oder den freigegebenen Speicher.
- Nutzern erlauben, Dateien aus app-spezifischen Verzeichnissen an einen allgemeiner zugänglichen Speicherort zu verschieben. Verwenden Sie die Bild-, Video- und Audiosammlungen von MediaStore, um Mediendateien nach in der Galerie des Geräts.
Mehrere Mediendateien in einem Vorgang ändern oder löschen
Berücksichtigen Sie die Logik der Android-Versionen, unter denen Ihre App ausgeführt wird.
Mit Android 11
Gehen Sie folgendermaßen vor:
- Erstellen Sie mit dem folgenden Befehl einen ausstehenden Intent für die Schreib- oder Löschanfrage Ihrer Anwendung:
MediaStore.createWriteRequest()
oderMediaStore.createTrashRequest()
und fordern den Nutzer um die Berechtigung zum Bearbeiten einer Reihe von Dateien auf, indem er den folgenden Befehl aufruft: die Nutzerabsicht verstehen. Bewerten Sie die Antwort des Nutzers:
- Wenn die Berechtigung gewährt wurde, fahren Sie mit dem Ändern oder Löschen fort.
- Wurde die Berechtigung nicht erteilt, erläutere dem Nutzer, warum die Funktion in benötigt deine App die Berechtigung.
Weitere Informationen zum Verwalten von Mediengruppen Dateien mit diesen , die unter Android 11 und höher verfügbar sind.
Läuft mit Android 10
Wenn Ihre App auf Android 10 (API-Level 29) ausgerichtet ist, deaktivieren Sie den abgegrenzten Speicher und verwenden Sie für diesen Vorgang weiterhin den Ansatz für Android 9 und niedriger.
Android 9 oder niedriger
Verwenden Sie diesen Ansatz:
- Fordere die Berechtigung
WRITE_EXTERNAL_STORAGE
gemäß den Best Practices unter App-Berechtigungen anfordern an. - Verwenden Sie die
MediaStore
API, um Änderungen vorzunehmen. oder die Mediendateien löschen.
Einzelnes vorhandenes Bild importieren
Wenn Sie ein einzelnes Image importieren möchten, das bereits vorhanden ist (z. B. um als Foto für das Nutzerprofil verwenden, kann Ihre App entweder ihre eigene Benutzeroberfläche für die oder die Systemauswahl verwenden.
Ihre eigene Benutzeroberfläche präsentieren
Gehen Sie folgendermaßen vor:
- Folgen Sie den Best Practices unter App-Berechtigungen anfordern.
READ_EXTERNAL_STORAGE
anfordern Berechtigung. - Verwenden Sie den
query()
. Die API zum Abfragen einer Mediensammlung. - Die Ergebnisse in der benutzerdefinierten Benutzeroberfläche Ihrer App anzeigen
Systemauswahl verwenden
Verwenden Sie den ACTION_GET_CONTENT
.
Intent, bei dem der Nutzer aufgefordert wird, ein Image für den Import auszuwählen.
Wenn Sie die Arten von Bildern filtern möchten, die der Nutzer in der Systemauswahl auswählen kann, verwenden Sie setType()
oder EXTRA_MIME_TYPES
.
Einzelnes Bild aufnehmen
Wenn Sie ein einzelnes Bild aufnehmen möchten, das Sie in Ihrer App verwenden möchten, z. B. von
als Foto für das Nutzerprofil verwenden, verwenden Sie
ACTION_IMAGE_CAPTURE
Nutzer dazu aufzufordern, ein Foto mit der Kamera des Geräts aufzunehmen. Das System
das aufgenommene Foto im
MediaStore.Images
-Tabelle.
Mediendateien mit anderen Apps teilen
Verwenden Sie die Methode insert()
, um Einträge direkt in den MediaStore aufzunehmen. Weitere Informationen finden Sie im Abschnitt Element hinzufügen des Leitfadens zum Medienspeicher.
Mediendateien für eine bestimmte App freigeben
Du kannst die Android-Komponente FileProvider
wie unter Datei einrichten beschrieben verwenden.
finden Sie weitere Informationen.
Auf Dateien über Code oder Bibliotheken zugreifen, die direkte Dateipfade verwenden
Integrieren Sie Logik basierend auf den Android-Versionen, auf denen Ihre App ausgeführt wird.
Mit Android 11
Gehen Sie folgendermaßen vor:
- Folgen Sie den Best Practices unter App-Berechtigungen anfordern.
READ_EXTERNAL_STORAGE
anfordern Berechtigung. - Greifen Sie über direkte Dateipfade auf die Dateien zu.
Weitere Informationen finden Sie im Abschnitt zum Öffnen von Mediendateien über direkte Dateipfade.
Android 10
Wenn deine App auf Android 10 (API-Level 29) ausgerichtet ist, deaktiviere die eingeschränkte und speichere Speicherplatz. Unter Android 9 und darunter liegen, um diesen Vorgang auszuführen.
Android 9 oder niedriger
Verwenden Sie diesen Ansatz:
- Folgen Sie den Best Practices unter App-Berechtigungen anfordern.
WRITE_EXTERNAL_STORAGE
anfordern Berechtigung. - Sie können über direkte Dateipfade auf die Dateien zugreifen.
Nicht-Mediendateien verarbeiten
In diesem Abschnitt werden einige der häufigsten Anwendungsfälle für die Verarbeitung von Nicht-Mediendateien beschrieben. und erklärt den übergeordneten Ansatz, den Ihre App nutzen kann. In der folgenden Tabelle fasst jeden dieser Anwendungsfälle zusammen und enthält Links zu den einzelnen Abschnitten, enthalten weitere Details.
Anwendungsfall | Zusammenfassung |
---|---|
Dokumentdatei öffnen | Verwenden Sie für alle Android-Versionen denselben Ansatz. |
In Dateien auf sekundären Speichervolumes schreiben | Verwenden Sie einen Ansatz für Android 11. Verwenden Sie einen anderen Ansatz für Versionen von Android. |
Vorhandene Dateien von einem bisherigen Speicherort migrieren | Migrieren Sie Ihre Dateien nach Möglichkeit in den Speicher mit begrenztem Zugriff. Auf Ebene des Umfangs deaktivieren Speicherplatz für Android 10, wenn nötig. |
Inhalte für andere Apps freigeben | Verwenden Sie für alle Android-Versionen die gleiche Herangehensweise. |
Nicht-Mediendateien im Cache speichern | Verwenden Sie für alle Android-Versionen denselben Ansatz. |
Nicht-Mediendateien auf ein Gerät exportieren | Verwenden Sie einen Ansatz, wenn Ihre App den begrenzten Speicher verwendet. Verwenden Sie ein anderes wenn Sie den begrenzten Speicher für Ihre Anwendung deaktivieren. |
Dokumentdatei öffnen
Verwenden Sie die ACTION_OPEN_DOCUMENT
-Intent, um den Nutzer aufzufordern, eine Datei über die Systemauswahl zu öffnen. Wenn Sie die Dateitypen filtern möchten, die dem Nutzer in der Systemauswahl angezeigt werden, können Sie setType()
oder EXTRA_MIME_TYPES
verwenden.
Beispielsweise können Sie alle PDF-, ODT- und TXT-Dateien mit der folgenden Abfrage finden: Code:
startActivityForResult( Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "*/*" putExtra(Intent.EXTRA_MIME_TYPES, arrayOf( "application/pdf", // .pdf "application/vnd.oasis.opendocument.text", // .odt "text/plain" // .txt )) }, REQUEST_CODE )
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] { "application/pdf", // .pdf "application/vnd.oasis.opendocument.text", // .odt "text/plain" // .txt }); startActivityForResult(intent, REQUEST_CODE);
In Dateien auf sekundären Speichervolumes schreiben
Sekundäre Speicher-Volumes enthalten SD-Karten. Mit der Klasse StorageVolume
können Sie auf Informationen zu einem bestimmten Speichervolume zugreifen.
Integrieren Sie Logik basierend auf der Android-Version, auf der Ihre App ausgeführt wird.
Läuft mit Android 11
Gehen Sie folgendermaßen vor:
- Verwenden Sie das Modell Eingeschränkter Speicher.
- Die App muss auf Android 10 (API-Level 29) oder niedriger ausgerichtet sein.
- Deklarieren Sie die Berechtigung
WRITE_EXTERNAL_STORAGE
. - Sie haben folgende Möglichkeiten:
- Dateizugriff über die
MediaStore
API - Direkter Zugriff auf den Dateipfad über APIs wie
File
oderfopen()
.
- Dateizugriff über die
Ausführung auf älteren Versionen
Verwenden Sie das Storage Access Framework, mit dem Nutzer den Speicherort auf einem sekundären Speichervolume auswählen können, an dem Ihre App die Datei schreiben kann.
Vorhandene Dateien von einem alten Speicherort migrieren
Ein Verzeichnis gilt als altmodischer Speicherort, wenn es sich nicht um ein app-spezifisches Verzeichnis oder ein öffentlich freigegebenes Verzeichnis handelt. Wenn Ihre App Dateien an einem bisherigen Speicherort erstellt oder verwendet, empfehlen wir Ihnen, die Dateien Ihrer App an einen Speicherort zu migrieren, auf den mit dem Speicher mit begrenztem Zugriff zugegriffen werden kann. Nehmen Sie außerdem alle erforderlichen App-Änderungen vor, damit sie mit Dateien im Speicher mit begrenztem Zugriff funktioniert.
Zugriff auf den alten Speicherort für die Datenmigration beibehalten
Ihre App muss weiterhin Zugriff auf den alten Speicherort haben, um Anwendungsdateien an Speicherorte migrieren, auf die mit eingeschränktem Speicher zugegriffen werden kann Welchen Ansatz Sie verwenden sollten, hängt vom Ziel-API-Level Ihrer App ab.
Wenn Ihre App auf Android 11 ausgerichtet ist
Legen Sie das Flag
preserveLegacyExternalStorage
auftrue
fest, um das alte Speichermodell beizubehalten, damit Ihre App die Daten eines Nutzers migrieren kann, wenn er auf die neue Version Ihrer App umstellt, die auf Android 11 ausgerichtet ist.Deaktivieren Sie weiterhin den abgegrenzten Speicher, damit Ihre App weiterhin auf Ihre Dateien am bisherigen Speicherort auf Android 10-Geräten zugreifen kann.
Wenn Ihre App auf Android 10 ausgerichtet ist
Deaktivieren Sie den befristeten Speicher, um das Verhalten Ihrer App in verschiedenen Android-Versionen einfacher zu verwalten.
App-Daten migrieren
Wenn Ihre App für die Migration bereit ist, gehen Sie so vor:
- Richten Sie Ihre App auf Android 10 oder niedriger aus.
- Deaktivieren Sie den Speicher mit Bereichsbeschränkung, damit Ihre App auf die Dateien zugreifen kann, die Sie migrieren müssen.
-
Code bereitstellen, der die
File
API zum Verschieben von Dateien aus seinem unter/sdcard/
bis zu einem Standort, der zugänglich ist mit begrenztem Speicher:- Verschieben Sie alle privaten App-Dateien in das Verzeichnis, das von der Methode
getExternalFilesDir()
zurückgegeben wird. - Verschieben Sie alle freigegebenen Nicht-Medien-Dateien in ein App-eigenes Unterverzeichnis von
das Verzeichnis
Downloads/
.
- Verschieben Sie alle privaten App-Dateien in das Verzeichnis, das von der Methode
- Entfernen Sie die alten Speicherverzeichnisse Ihrer App aus dem
/sdcard/
-Verzeichnis.
Nachdem Nutzer die neue Version Ihrer App installiert haben, vervollständigen sie die Daten. Migrationsprozess auf ihren Geräten. Sie können den Migrationsprozess für Ihre gesamte Nutzerbasis im Blick behalten, indem Sie ein Analyseereignis erstellen.
Nachdem die Nutzer ihre Daten migriert haben, veröffentlichen Sie ein weiteres Update in Ihrer App. Dabei auf Android 11 ausgerichtet ist.
Inhalte mit anderen Apps teilen
Um die Dateien Ihrer App für eine einzelne App freizugeben, verwenden Sie ein
FileProvider
Für Apps, die gemeinsam
zwischen verschiedenen Dateien, empfehlen wir die Verwendung eines Inhalts
App-Anbieter und
Anschließend werden die Daten synchronisiert, sobald Apps zur Sammlung hinzugefügt werden.
Nicht-Mediendateien im Cache speichern
Ihr Ansatz hängt davon ab, welche Art von Dateien Sie im Cache gespeichert werden soll.
- Kleine Dateien oder Dateien mit vertraulichen Daten: Verwenden Sie
Context#getCacheDir()
- Große Dateien oder Dateien ohne vertrauliche Informationen: Verwenden Sie
Context#getExternalCacheDir()
.
Nicht-Mediendateien auf ein Gerät exportieren
Legen Sie einen geeigneten Standardspeicherort für nicht mediabezogene Dateien fest. Nutzern erlauben, Dateien aus app-spezifischen Verzeichnissen an einen allgemein zugänglichen Speicherort zu exportieren. Verwenden Sie die Downloads oder Dokumentensammlungen von MediaStore, um Nicht-Media-Dateien nach auf dem Gerät.
App-spezifische Dateien verarbeiten
Wenn Ihre App Dateien erstellt, auf die andere Apps nicht zugreifen müssen oder sollten, können Sie diese Dateien an appspezifischen Speicherorten speichern.
Verzeichnisse im internen Speicher
Das System verhindert, dass andere Apps auf diese Standorte zugreifen. unter Android 10 (API-Level 29) und höher werden diese Standorte verschlüsselt. Diese Speicherorte eignen sich gut für vertrauliche Daten, auf die nur Ihre App zugreifen kann.
Verzeichnisse für externen Speicher
Wenn der interne Speicher nicht genügend Speicherplatz für App-spezifische Dateien bietet, sollten Sie stattdessen einen externen Speicher verwenden. Es ist zwar möglich, dass eine andere App um auf diese Verzeichnisse zuzugreifen Wenn diese App die entsprechenden Berechtigungen hat, werden die in diesen Verzeichnissen gespeicherten Dateien nur für die Nutzung durch Ihre App bestimmt sind.
Unter Android 4.4 (API-Level 19) oder höher muss Ihre App keine speicherbezogenen Berechtigungen anfordern, um auf appspezifische Verzeichnisse im externen Speicher zuzugreifen.
Wenn der Nutzer deine App deinstalliert, werden die im App-spezifischen Speicher gespeicherten Dateien entfernt. Daher sollten Sie diesen Speicher nicht nutzen, alles, was der Nutzer erwartet, unabhängig von Ihrer App.
Eingeschränkten Speicher vorübergehend deaktivieren
Solange Ihre App nicht vollständig mit dem abgegrenzten Speicher kompatibel ist, können Sie die Funktion sowohl in Ihren Tests als auch in Ihrer Produktions-App vorübergehend deaktivieren.
In Tests deaktivieren
Unter Android 10 (API-Level 29) und höher werden die Tests Ihrer App in einem Speicher ausgeführt Sandbox ausführen. Diese Sandbox verhindert, dass Ihre App auf Dateien außerhalb des app-spezifischen Verzeichnisses und öffentlich freigegebenen Verzeichnissen zugreift.
Gibt ein Test Dateien für den Host aus, z. B. Screenshots,
Abdeckungsdaten oder Leistungsmesswerte an. Sie können diese Dateien
Verzeichnisse enthalten. Fügen Sie dazu das folgende Flag zum entsprechenden App-Anbieter hinzu,
Ruft am instrument
auf:
-e no-isolated-storage 1
Dieses Flag wirkt sich auf das gesamte Verhalten des instrumentierten Testlaufs und alle
aufgerufenen Testcode. Wenn Sie dieses Flag verwenden, können Sie daher Ihre
die Kompatibilität der Anwendung mit begrenztem Speicher. Für die Testausgabe empfiehlt es sich, stattdessen
in einen Anwendungsbereich,
der von der Shell gelesen werden kann. Sie können dann dieses Verzeichnis auf App-Ebene abrufen. Um zu ermitteln, aus welchem Verzeichnis abgerufen werden soll, rufen Sie
getExternalMediaDirs()
Deaktivierung in Ihrer Produktions-App
Wenn Ihre App auf Android 10 (API-Level 29) oder niedriger ausgerichtet ist, können Sie den abgegrenzten Speicher in Ihrer Produktions-App vorübergehend deaktivieren. Wenn Sie jedoch auf Android 10 ausgerichtet sind, müssen Sie in der Manifestdatei Ihrer App den Wert von requestLegacyExternalStorage
auf true
festlegen:
<manifest ... > <!-- This attribute is "false" by default on apps targeting Android 10. --> <application android:requestLegacyExternalStorage="true" ... > ... </application> </manifest>
Um zu testen, wie sich eine auf Android 10 oder niedriger ausgerichtete App verhält, wenn
begrenztem Speicher verwendet wird, können Sie dieses Verhalten aktivieren, indem Sie den Wert
requestLegacyExternalStorage
in false
. Wenn Sie einen Test auf einem Gerät durchführen,
mit Android 11 läuft, können Sie auch die App-Kompatibilität nutzen
Flags, um Ihre
App-Verhalten mit oder ohne begrenztem Speicher.
Weitere Informationen
Weitere Informationen zum Android-Speicher finden Sie in den folgenden Artikeln: