Über freigegebenen Speicher auf Mediendateien zugreifen

Viele Apps ermöglichen es Nutzern, Medien auf einem externen Speichermedium zu nutzen und zu bearbeiten, um die Nutzerfreundlichkeit zu verbessern. Das Framework bietet einen optimierten Index für Mediensammlungen, den Media Store. Damit können Nutzer diese Mediendateien abrufen und aktualisieren. Auch nach der Deinstallation Ihrer App verbleiben diese Dateien auf dem Gerät des Nutzers.

Bildauswahl

Als Alternative zur Verwendung des Media Store bietet die Android-Bildauswahl Nutzern eine sichere, integrierte Möglichkeit, Mediendateien auszuwählen, ohne Ihrer App Zugriff auf ihre gesamte Mediathek gewähren zu müssen. Diese Funktion ist nur auf unterstützten Geräten verfügbar. Weitere Informationen finden Sie im Leitfaden zur Bildauswahl.

Medienspeicher

Wenn Sie mit der Media Store-Abstraktion interagieren möchten, verwenden Sie ein ContentResolver-Objekt, das Sie aus dem Kontext Ihrer App abrufen:

Kotlin

val projection = arrayOf(media-database-columns-to-retrieve)
val selection = sql-where-clause-with-placeholder-variables
val selectionArgs = values-of-placeholder-variables
val sortOrder = sql-order-by-clause

applicationContext.contentResolver.query(
    MediaStore.media-type.Media.EXTERNAL_CONTENT_URI,
    projection,
    selection,
    selectionArgs,
    sortOrder
)?.use { cursor ->
    while (cursor.moveToNext()) {
        // Use an ID column from the projection to get
        // a URI representing the media item itself.
    }
}

Java

String[] projection = new String[] {
        media-database-columns-to-retrieve
};
String selection = sql-where-clause-with-placeholder-variables;
String[] selectionArgs = new String[] {
        values-of-placeholder-variables
};
String sortOrder = sql-order-by-clause;

Cursor cursor = getApplicationContext().getContentResolver().query(
    MediaStore.media-type.Media.EXTERNAL_CONTENT_URI,
    projection,
    selection,
    selectionArgs,
    sortOrder
);

while (cursor.moveToNext()) {
    // Use an ID column from the projection to get
    // a URI representing the media item itself.
}

Das System scannt automatisch ein externes Speichermedium und fügt Mediendateien den folgenden genau definierten Sammlungen hinzu:

  • Bilder,einschließlich Fotos und Screenshots, die in den Verzeichnissen DCIM/ und Pictures/ gespeichert sind. Das System fügt diese Dateien der Tabelle MediaStore.Images hinzu.
  • Videos, die in den Verzeichnissen DCIM/, Movies/ und Pictures/ gespeichert sind. Das System fügt diese Dateien der Tabelle MediaStore.Video hinzu.
  • Audiodateien, die in den Verzeichnissen Alarms/, Audiobooks/, Music/, Notifications/, Podcasts/ und Ringtones/ gespeichert sind. Außerdem erkennt das System Audio-Playlists, die sich in den Verzeichnissen Music/ oder Movies/ befinden, sowie Sprachaufnahmen, die sich im Verzeichnis Recordings/ befinden. Das System fügt diese Dateien der Tabelle MediaStore.Audio hinzu. Das Verzeichnis Recordings/ ist unter Android 11 (API-Level 30) und niedriger nicht verfügbar.
  • Heruntergeladene Dateien,die im Verzeichnis Download/ gespeichert sind. Auf Geräten mit Android 10 (API-Level 29) und höher werden diese Dateien in der Tabelle MediaStore.Downloads gespeichert. Diese Tabelle ist unter Android 9 (API-Level 28) und niedriger nicht verfügbar.

Der Medienspeicher enthält auch eine Sammlung namens MediaStore.Files. Der Inhalt hängt davon ab, ob Ihre App Scoped Storage verwendet, das für Apps verfügbar ist, die auf Android 10 oder höher ausgerichtet sind.

  • Wenn der begrenzte Speicher aktiviert ist, werden in der Sammlung nur die Fotos, Videos und Audiodateien angezeigt, die von Ihrer App erstellt wurden. Die meisten Entwickler müssen MediaStore.Files nicht verwenden, um Mediendateien aus anderen Apps aufzurufen. Wenn Sie jedoch eine bestimmte Anforderung haben, können Sie die Berechtigung READ_EXTERNAL_STORAGE deklarieren. Wir empfehlen jedoch, die MediaStore-APIs zu verwenden, um Dateien zu öffnen, die nicht von Ihrer App erstellt wurden.
  • Wenn der begrenzte Speicher nicht verfügbar ist oder nicht verwendet wird, werden in der Sammlung alle Arten von Mediendateien angezeigt.

Erforderliche Berechtigungen anfordern

Bevor Sie Vorgänge für Mediendateien ausführen, müssen Sie dafür sorgen, dass Ihre App die Berechtigungen deklariert hat, die für den Zugriff auf diese Dateien erforderlich sind. Achten Sie jedoch darauf, keine Berechtigungen zu deklarieren, die Ihre App nicht benötigt oder verwendet.

Speicherberechtigungen

Ob Ihre App Berechtigungen für den Zugriff auf den Speicher benötigt, hängt davon ab, ob sie nur auf ihre eigenen Mediendateien oder auf Dateien zugreift, die von anderen Apps erstellt wurden.

Auf eigene Mediendateien zugreifen

Auf Geräten mit Android 10 oder höher benötigen Sie keine speicherbezogenen Berechtigungen, um auf Mediendateien zuzugreifen und sie zu ändern, die Ihrer App gehören, einschließlich Dateien in der Sammlung MediaStore.Downloads. Wenn Sie beispielsweise eine Kamera-App entwickeln, müssen Sie keine speicherbezogenen Berechtigungen anfordern, um auf die aufgenommenen Fotos zuzugreifen, da Ihre App die Bilder besitzt, die Sie in den Media Store schreiben.

Auf Mediendateien anderer Apps zugreifen

Wenn Sie auf Mediendateien zugreifen möchten, die von anderen Apps erstellt wurden, müssen Sie die entsprechenden speicherbezogenen Berechtigungen deklarieren. Die Dateien müssen sich in einer der folgenden Mediensammlungen befinden:

Solange eine Datei über die Abfragen MediaStore.Images, MediaStore.Video oder MediaStore.Audio aufgerufen werden kann, ist sie auch über die Abfrage MediaStore.Files aufrufbar.

Das folgende Code-Snippet zeigt, wie Sie die entsprechenden Speicherberechtigungen deklarieren:

<!-- Required only if your app needs to access images or photos
     that other apps created. -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

<!-- Required only if your app needs to access videos
     that other apps created. -->
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

<!-- Required only if your app needs to access audio files
     that other apps created. -->
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                 android:maxSdkVersion="29" />

Zusätzliche Berechtigungen für Apps, die auf älteren Geräten ausgeführt werden

Wenn Ihre App auf einem Gerät mit Android 9 oder niedriger verwendet wird oder wenn Ihre App vorübergehend von der Verwendung von Speicher mit beschränktem Zugriff ausgeschlossen wurde, müssen Sie die Berechtigung READ_EXTERNAL_STORAGE anfordern, um auf Mediendateien zuzugreifen. Wenn Sie Mediendateien ändern möchten, müssen Sie auch die Berechtigung WRITE_EXTERNAL_STORAGE anfordern.

Storage Access Framework für den Zugriff auf Downloads anderer Apps erforderlich

Wenn Ihre App auf eine Datei in der Sammlung MediaStore.Downloads zugreifen möchte, die nicht von Ihrer App erstellt wurde, müssen Sie das Storage Access Framework verwenden. Weitere Informationen zur Verwendung dieses Frameworks finden Sie unter Auf Dokumente und andere Dateien aus dem gemeinsamen Speicher zugreifen.

Berechtigung zur Standortermittlung für Medien

Wenn Ihre App auf Android 10 (API‑Level 29) oder höher ausgerichtet ist und nicht bearbeitete EXIF-Metadaten aus Fotos abrufen muss, müssen Sie die Berechtigung ACCESS_MEDIA_LOCATION im Manifest Ihrer App deklarieren und diese Berechtigung dann zur Laufzeit anfordern.