Android-Speicher – Anwendungsfälle und Best Practices

Um Nutzern mehr Kontrolle über ihre Dateien zu geben und Dateien übersichtlicher zu gestalten, Mit Android 10 wurde ein neues Speichermodell für Apps eingeführt: eingeschränktem 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.

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 häufigsten Anwendungsfälle für den Umgang mit Mediendateien beschrieben. (Video-, Bild- und Audiodateien) enthält und erklärt den übergeordneten Ansatz, die die App verwenden kann. 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 die gleiche Herangehensweise.
Bilder oder Videos von einer bestimmten Ordner Verwenden Sie für alle Android-Versionen die gleiche Herangehensweise.
Zugriff auf Standortinformationen von Fotos Verwenden Sie einen Ansatz, wenn Ihre Anwendung beschränkten Speicher verwendet. Verwenden Sie ein anderes wenn Sie den begrenzten Speicher für Ihre Anwendung deaktivieren.
Speicherort für neue Downloads festlegen Verwenden Sie einen Ansatz, wenn Ihre Anwendung beschränkten 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 die gleiche Herangehensweise.
Mehrere Mediendateien in mit nur einem Vorgang 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 die gleiche Herangehensweise.
Ein einzelnes Bild aufnehmen Verwenden Sie für alle Android-Versionen die gleiche Herangehensweise.
Mediendateien mit anderen Apps teilen Verwenden Sie für alle Android-Versionen die gleiche Herangehensweise.
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. Für Android 10 die Funktion „Bereich“ deaktivieren und verwenden 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

Gehen Sie folgendermaßen vor:

  1. Folgen Sie den Best Practices unter App-Berechtigungen anfordern. READ_EXTERNAL_STORAGE anfordern Berechtigung.
  2. 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. Gehen Sie jedoch nicht davon aus, 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 Anwendung beschränkten Speicher verwendet, folgen Sie den Schritten unter Standortinformationen auf 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, sollten Sie klar definierte Medien verwenden. Sammlungen für Downloads oder Dokumentensammlungen.

Unter Android 11 und höher werden die Dateien in Ihren externen App-spezifischen sind für andere Apps nicht zugänglich, auch wenn Sie DownloadManager für Folgendes verwenden: um diese Dateien abzurufen.

Nutzermediendateien auf ein Gerät exportieren

Geeigneten Standardspeicherort zum Speichern von Nutzermedien festlegen Dateien:

Mehrere Mediendateien in einem Vorgang ändern oder löschen

Integrieren Sie Logik basierend auf den Android-Versionen, auf denen Ihre App ausgeführt wird.

Mit Android 11

Gehen Sie folgendermaßen vor:

  1. Erstellen Sie mit dem folgenden Befehl einen ausstehenden Intent für die Schreib- oder Löschanfrage Ihrer Anwendung: MediaStore.createWriteRequest() oder MediaStore.createTrashRequest() und fordern den Nutzer um die Berechtigung zum Bearbeiten einer Reihe von Dateien auf, indem er den folgenden Befehl aufruft: die Nutzerabsicht verstehen.
  2. Bewerten Sie die Antwort der Nutzenden:

    • Wenn die Berechtigung gewährt wurde, fahren Sie mit dem Änderungs- oder Löschvorgang 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 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

Gehen Sie folgendermaßen vor:

  1. Folgen Sie den Best Practices unter App-Berechtigungen anfordern. WRITE_EXTERNAL_STORAGE anfordern Berechtigung.
  2. Verwenden Sie die MediaStore API, um Änderungen vorzunehmen. oder die Mediendateien löschen.

Einzelnes bereits 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:

  1. Folgen Sie den Best Practices unter App-Berechtigungen anfordern. READ_EXTERNAL_STORAGE anfordern Berechtigung.
  2. Verwenden Sie den query(). Die API zum Abfragen einer Mediensammlung.
  3. Zeigen Sie die Ergebnisse in der benutzerdefinierten UI Ihrer App an.

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 Bildtypen filtern möchten, die die Systemauswahl zur Auswahl stehen, können 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 speichert das aufgenommene Foto im MediaStore.Images-Tabelle.

Mediendateien mit anderen Apps teilen

Verwenden Sie die Methode insert() , um Datensätze direkt zum MediaStore hinzuzufügen. Weitere Informationen finden Sie unter im Abschnitt Element hinzufügen des Leitfaden zur Medienspeicherung.

Mediendateien mit einer bestimmten App teilen

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:

  1. Folgen Sie den Best Practices unter App-Berechtigungen anfordern. READ_EXTERNAL_STORAGE anfordern Berechtigung.
  2. Greifen Sie über direkte Dateipfade auf die Dateien zu.

Weitere Informationen findest du im Abschnitt zum Öffnen von Mediendateien mit direkte Dateipfade.

Läuft mit 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

Gehen Sie folgendermaßen vor:

  1. Folgen Sie den Best Practices unter App-Berechtigungen anfordern. WRITE_EXTERNAL_STORAGE anfordern Berechtigung.
  2. Greifen Sie über direkte Dateipfade auf die Dateien zu.

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
Dokumente öffnen Verwenden Sie für alle Android-Versionen die gleiche Herangehensweise.
In Dateien schreiben auf sekundäre Speicher-Volumes Verwenden Sie einen Ansatz für Android 11. Verwenden Sie einen anderen Ansatz für Versionen von Android.
Vorhandene Dateien von einem alten Speicherort Migrieren Sie Ihre Dateien nach Möglichkeit auf einen begrenzten Speicher. Auf Ebene des Umfangs deaktivieren Speicherplatz für Android 10, wenn nötig.
Inhalte mit anderen teilen Apps Verwenden Sie für alle Android-Versionen die gleiche Herangehensweise.
Nicht-Mediendateien im Cache speichern Verwenden Sie für alle Android-Versionen die gleiche Herangehensweise.
Nicht-Mediendateien auf ein Gerät exportieren Verwenden Sie einen Ansatz, wenn Ihre Anwendung beschränkten Speicher verwendet. Verwenden Sie ein anderes wenn Sie den begrenzten Speicher für Ihre Anwendung deaktivieren.

Dokumentdatei öffnen

Verwenden Sie den ACTION_OPEN_DOCUMENT. Intent, der den Nutzer auffordert, eine Datei zum Öffnen mit der Systemauswahl auszuwählen. Wenn Sie die Dateitypen filtern, die die Systemauswahl zur Auswahl stehen, können Sie setType() oder EXTRA_MIME_TYPES.

Beispielsweise können Sie alle PDF-, ODT- und TXT-Dateien mit der folgenden Abfrage finden: Code:

Kotlin

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
      )

Java

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 Speicher-Volumes schreiben

Sekundäre Speicher-Volumes enthalten SD-Karten. Sie können auf Informationen zu eines Speicher-Volumes Klasse StorageVolume.

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:

  1. Verwenden Sie das Modell Eingeschränkter Speicher.
  2. Die App muss auf Android 10 (API-Level 29) oder niedriger ausgerichtet sein.
  3. Deklarieren Sie die WRITE_EXTERNAL_STORAGE Berechtigung.
  4. Sie haben folgende Möglichkeiten: <ph type="x-smartling-placeholder">
      </ph>
    • Dateizugriff mit der MediaStore API.
    • Direkter Zugriff auf den Dateipfad über APIs wie File oder fopen().

Unter älteren Versionen ausführen

Die Funktion Speicherzugriff Framework, mit dem Nutzer Wählen Sie den Speicherort auf einem sekundären Speicher-Volume aus, in das Ihre Anwendung den -Datei.

Vorhandene Dateien von einem alten Speicherort migrieren

Ein Verzeichnis gilt als Legacy-Speicherort, wenn es sich nicht um einen App-spezifisches Verzeichnis oder ein öffentliches freigegebenes Verzeichnis. Wenn Ihre App an einem alten Speicherort Dateien verbraucht, empfehlen wir, dass Sie Ihre an Speicherorten abgelegt, auf die mit beschränktem Speicher zugegriffen werden kann, und für die Arbeit mit Dateien in begrenztem Speicher.

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 Die Ihr Ansatz hängt vom Ziel-API-Level Ihrer App ab.

Wenn Ihre App auf Android 11 ausgerichtet ist
  1. Legen Sie die preserveLegacyExternalStorage Flag auf true setzen, um den Legacy-Speicher beizubehalten dass Ihre Anwendung die Daten eines Nutzers migrieren kann, wenn dieser ein Upgrade auf die neue Version von für deine App, die auf Android 11 ausgerichtet ist.

  2. Fahren Sie mit der Deaktivierung des begrenzten Speichers fort, damit kann Ihre App weiterhin am alten Speicherort auf Ihre Dateien zugreifen Geräte mit Android 10.

Wenn Ihre App auf Android 10 ausgerichtet ist

Den begrenzten Speicher deaktivieren, um um das Verhalten deiner App für alle Android-Versionen beizubehalten.

App-Daten migrieren

Wenn Ihre Anwendung für die Migration bereit ist, gehen Sie so vor:

  1. Richten Sie Ihre App auf Android 10 oder niedriger aus.
  2. Deaktivieren Sie den begrenzten Speicher, damit Ihre Anwendung Zugriff auf die zu migrierenden Dateien hat.
  3. 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:

    1. Verschieben Sie alle privaten App-Dateien in das Verzeichnis, das vom getExternalFilesDir() .
    2. Verschieben Sie alle freigegebenen Nicht-Medien-Dateien in ein App-eigenes Unterverzeichnis von das Verzeichnis Downloads/.
  4. 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 durch das Erstellen eines Analytics-Ereignisses.

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.

Nicht-Mediendateien auf ein Gerät exportieren

Geeigneten Standardspeicherort zum Speichern von Nicht-Medien festlegen Dateien. Nutzern erlauben, Dateien aus app-spezifischen Verzeichnissen an einen allgemeiner zugänglichen Speicherort zu verschieben. Verwenden Sie die Downloads oder Dokumentensammlungen von MediaStore, um Nicht-Media-Dateien nach auf dem Gerät.

Eingeschränkten Speicher vorübergehend deaktivieren

Bevor Ihre App vollständig mit begrenztem Speicher kompatibel ist, können Sie vorübergehend sowohl in Ihren Tests als auch in Ihrer Produktion App.

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 den Zugriff deiner App auf Dateien außerhalb von des App-spezifischen Verzeichnisses und der öffentlich freigegebenen Verzeichnisse.

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. Diese können Sie dann App-Bereichsverzeichnis. Um zu ermitteln, aus welchem Verzeichnis abgerufen werden soll, rufen Sie getExternalMediaDirs()

In der Produktions-App deaktivieren

Wenn Ihre App auf Android 10 (API-Level 29) oder niedriger ausgerichtet ist, können Sie nicht genügend Speicherplatz in Ihrer Produktions-App. Wenn Sie Unter Android 10 müssen Sie jedoch den Wert requestLegacyExternalStorage bis true in der Manifestdatei Ihrer App:

<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 mit begrenztem Speicher 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-Speicherplatz finden Sie hier:

Blogposts