Bildauswahl

Das Dialogfeld für die Bildauswahl wird mit Mediendateien auf Ihrem Gerät angezeigt. Wählen Sie ein Foto aus, das Sie mit der App teilen möchten.
Abbildung 1: Die Bildauswahl bietet eine intuitive Benutzeroberfläche zum Teilen von Fotos mit Ihrer App.

Die Bildauswahl bietet eine durchsuchbare, durchsuchbare Oberfläche, auf der dem Nutzer seine Mediathek angezeigt wird, sortiert nach Datum vom neuesten zum ältesten Datum. Wie im Codelab zu Best Practices zum Datenschutz gezeigt, bietet die Bildauswahl Nutzern eine sichere, integrierte Möglichkeit, Ihrer App nur Zugriff auf ausgewählte Bilder und Videos statt auf die gesamte Mediathek zu gewähren.

Nutzer mit berechtigten Cloud-Medienanbietern auf ihrem Gerät können auch aus der Ferne gespeicherte Fotos und Videos auswählen. Weitere Informationen zu Cloud-Medienanbietern

Das Tool wird automatisch aktualisiert und bietet den Nutzern Ihrer Anwendung im Laufe der Zeit erweiterte Funktionen, ohne dass Änderungen am Code erforderlich sind.

Jetpack-Aktivitätsverträge verwenden

Um die Einbindung der Bildauswahl zu vereinfachen, sollten Sie Version 1.7.0 oder höher der androidx.activity-Bibliothek verwenden.

Verwenden Sie die folgenden Verträge für Aktivitätsergebnisse, um die Bildauswahl zu starten:

Ist die Bildauswahl auf einem Gerät nicht verfügbar, ruft die Bibliothek stattdessen automatisch die Intent-Aktion ACTION_OPEN_DOCUMENT auf. Dieser Intent wird auf Geräten mit Android 4.4 (API-Level 19) oder höher unterstützt. Mit isPhotoPickerAvailable() kannst du prüfen, ob die Bildauswahl auf einem bestimmten Gerät verfügbar ist.

Einzelnes Medienelement auswählen

Wenn Sie ein einzelnes Medienelement auswählen möchten, verwenden Sie den Vertrag für das Aktivitätsergebnis PickVisualMedia, wie im folgenden Code-Snippet gezeigt:

Kotlin

// Registers a photo picker activity launcher in single-select mode.
val pickMedia = registerForActivityResult(PickVisualMedia()) { uri ->
    // Callback is invoked after the user selects a media item or closes the
    // photo picker.
    if (uri != null) {
        Log.d("PhotoPicker", "Selected URI: $uri")
    } else {
        Log.d("PhotoPicker", "No media selected")
    }
}

// Include only one of the following calls to launch(), depending on the types
// of media that you want to let the user choose from.

// Launch the photo picker and let the user choose images and videos.
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo))

// Launch the photo picker and let the user choose only images.
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageOnly))

// Launch the photo picker and let the user choose only videos.
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.VideoOnly))

// Launch the photo picker and let the user choose only images/videos of a
// specific MIME type, such as GIFs.
val mimeType = "image/gif"
pickMedia.launch(PickVisualMediaRequest(PickVisualMedia.SingleMimeType(mimeType)))

Java

// Registers a photo picker activity launcher in single-select mode.
ActivityResultLauncher<PickVisualMediaRequest> pickMedia =
        registerForActivityResult(new PickVisualMedia(), uri -> {
    // Callback is invoked after the user selects a media item or closes the
    // photo picker.
    if (uri != null) {
        Log.d("PhotoPicker", "Selected URI: " + uri);
    } else {
        Log.d("PhotoPicker", "No media selected");
    }
});

// Include only one of the following calls to launch(), depending on the types
// of media that you want to let the user choose from.

// Launch the photo picker and let the user choose images and videos.
pickMedia.launch(new PickVisualMediaRequest.Builder()
        .setMediaType(PickVisualMedia.ImageAndVideo.INSTANCE)
        .build());

// Launch the photo picker and let the user choose only images.
pickMedia.launch(new PickVisualMediaRequest.Builder()
        .setMediaType(PickVisualMedia.ImageOnly.INSTANCE)
        .build());

// Launch the photo picker and let the user choose only videos.
pickMedia.launch(new PickVisualMediaRequest.Builder()
        .setMediaType(PickVisualMedia.VideoOnly.INSTANCE)
        .build());

// Launch the photo picker and let the user choose only images/videos of a
// specific MIME type, such as GIFs.
String mimeType = "image/gif";
pickMedia.launch(new PickVisualMediaRequest.Builder()
        .setMediaType(new PickVisualMedia.SingleMimeType(mimeType))
        .build());

Mehrere Medienelemente auswählen

Wenn Sie mehrere Medienelemente auswählen möchten, legen Sie eine maximale Anzahl von auswählbaren Mediendateien fest, wie im folgenden Code-Snippet gezeigt.

Kotlin

// Registers a photo picker activity launcher in multi-select mode.
// In this example, the app lets the user select up to 5 media files.
val pickMultipleMedia =
        registerForActivityResult(PickMultipleVisualMedia(5)) { uris ->
    // Callback is invoked after the user selects media items or closes the
    // photo picker.
    if (uris.isNotEmpty()) {
        Log.d("PhotoPicker", "Number of items selected: ${uris.size}")
    } else {
        Log.d("PhotoPicker", "No media selected")
    }
}

// For this example, launch the photo picker and let the user choose images
// and videos. If you want the user to select a specific type of media file,
// use the overloaded versions of launch(), as shown in the section about how
// to select a single media item.
pickMultipleMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo))

Java

// Registers a photo picker activity launcher in multi-select mode.
// In this example, the app lets the user select up to 5 media files.
ActivityResultLauncher<PickVisualMediaRequest> pickMultipleMedia =
        registerForActivityResult(new PickMultipleVisualMedia(5), uris -> {
    // Callback is invoked after the user selects media items or closes the
    // photo picker.
    if (!uris.isEmpty()) {
        Log.d("PhotoPicker", "Number of items selected: " + uris.size());
    } else {
        Log.d("PhotoPicker", "No media selected");
    }
});

// For this example, launch the photo picker and let the user choose images
// and videos. If you want the user to select a specific type of media file,
// use the overloaded versions of launch(), as shown in the section about how
// to select a single media item.
pickMultipleMedia.launch(new PickVisualMediaRequest.Builder()
        .setMediaType(PickVisualMedia.ImageAndVideo.INSTANCE)
        .build());

Die Plattform beschränkt die maximale Anzahl von Dateien, die der Nutzer in der Bildauswahl auswählen kann. Rufen Sie getPickImagesMaxLimit() auf, um auf dieses Limit zuzugreifen. Auf Geräten, auf denen die Bildauswahl nicht unterstützt wird, wird diese Beschränkung ignoriert.

Geräteverfügbarkeit

Die Bildauswahl ist auf Geräten verfügbar, die die folgenden Kriterien erfüllen:

Auf älteren Geräten mit Android 4.4 (API-Level 19) bis Android 10 (API-Level 29) und Android Go-Geräten mit Android 11 oder 12, die Google Play-Dienste unterstützen, kann eine rückportierte Version der Bildauswahl installiert werden. Wenn Sie die automatische Installation der rückportierten Bildauswahl über Google Play-Dienste aktivieren möchten, fügen Sie dem <application>-Tag in der Manifestdatei Ihrer App den folgenden Eintrag hinzu:

<!-- Trigger Google Play services to install the backported photo picker module. -->
<service android:name="com.google.android.gms.metadata.ModuleDependencies"
         android:enabled="false"
         android:exported="false"
         tools:ignore="MissingClass">
    <intent-filter>
        <action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
    </intent-filter>
    <meta-data android:name="photopicker_activity:0:required" android:value="" />
</service>

Zugriff auf Mediendateien beibehalten

Standardmäßig gewährt das System Ihrer App so lange Zugriff auf Mediendateien, bis das Gerät neu gestartet oder die App beendet wird. Wenn Ihre Anwendung lang andauernde Arbeiten ausführt, z. B. eine große Datei im Hintergrund hochlädt, muss dieser Zugriff möglicherweise für einen längeren Zeitraum beibehalten werden. Rufen Sie dazu die Methode takePersistableUriPermission() auf:

Kotlin

val flag = Intent.FLAG_GRANT_READ_URI_PERMISSION
context.contentResolver.takePersistableUriPermission(uri, flag)

Java

int flag = Intent.FLAG_GRANT_READ_URI_PERMISSION;
context.contentResolver.takePersistableUriPermission(uri, flag);