Selektor zdjęć

Pojawi się okno wyboru zdjęć z plikami multimedialnymi na urządzeniu. Wybierz zdjęcie, które chcesz udostępnić aplikacji.
Rysunek 1. Selektor zdjęć to intuicyjny interfejs umożliwiający udostępnianie zdjęć w aplikacji.

Selektor zdjęć ma interfejs z możliwością przeglądania, który przedstawia bibliotekę multimediów posortowaną według daty od najnowszych do najstarszych. Jak pokazujemy w ćwiczeniach z programowania poświęconych sprawdzonym metodom ochrony prywatności, selektor zdjęć zapewnia użytkownikom bezpieczny, wbudowany sposób przyznawania aplikacji dostępu tylko do wybranych obrazów i filmów zamiast do całej biblioteki multimediów.

Użytkownicy, którzy mają na swoich urządzeniach odpowiednich dostawców treści w chmurze, mogą też wybierać spośród zdjęć i filmów przechowywanych zdalnie. Więcej informacji o dostawcach multimediów w chmurze

Narzędzie aktualizuje się automatycznie, dzięki czemu z czasem użytkownicy mogą korzystać z rozszerzonych funkcji bez konieczności wprowadzania zmian w kodzie.

Korzystaj z umów dotyczących aktywności Jetpack Activity

Aby uprościć integrację z selektorem zdjęć, dodaj bibliotekę androidx.activity w wersji 1.7.0 lub nowszej.

Użyj następujących umów dotyczących wyników aktywności, aby uruchomić selektor zdjęć:

Jeśli selektor zdjęć jest niedostępny na urządzeniu, biblioteka automatycznie wywołuje działanie intencji ACTION_OPEN_DOCUMENT. Ta intencja jest obsługiwana na urządzeniach z Androidem 4.4 (poziom interfejsu API 19) lub nowszym. Aby sprawdzić, czy selektor zdjęć jest dostępny na danym urządzeniu, wywołaj metodę isPhotoPickerAvailable().

Wybierz jeden element multimedialny

Aby wybrać pojedynczy element multimedialny, użyj umowy dotyczącej wyników aktywności PickVisualMedia, jak pokazano w tym fragmencie kodu:

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());

Wybierz wiele elementów multimedialnych

Aby wybrać wiele elementów multimedialnych, ustaw maksymalną liczbę plików multimedialnych, które można wybrać, zgodnie z tym fragmentem kodu.

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());

Platforma ogranicza maksymalną liczbę plików, które użytkownik może wybrać w selektorze zdjęć. Aby uzyskać dostęp do tego limitu, wywołaj getPickImagesMaxLimit(). Na urządzeniach, na których selektor zdjęć nie jest obsługiwany, ten limit jest ignorowany.

Dostępność urządzeń

Selektor zdjęć jest dostępny na urządzeniach spełniających te kryteria:

Na starszych urządzeniach z Androidem w wersji od 4.4 (poziom interfejsu API 19) do 10 (poziom interfejsu API 29) oraz na urządzeniach z Androidem Go z Androidem 11 lub 12, które obsługują Usługi Google Play, można zainstalować wstecznie przeportowaną wersję selektora zdjęć. Aby umożliwić automatyczną instalację modułu selektora zdjęć po przeniesieniu w Usługach Google Play, do tagu <application> w pliku manifestu aplikacji dodaj ten wpis:

<!-- 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>

Zachowuj dostęp do plików multimedialnych

Domyślnie system przyznaje aplikacji dostęp do plików multimedialnych do czasu ponownego uruchomienia urządzenia lub zakończenia działania aplikacji. Jeśli Twoja aplikacja wykonuje długotrwałe zadania, np. przesyła duży plik w tle, konieczne może być ustawienie tych uprawnień dostępu przez dłuższy czas. Aby to zrobić, wywołaj metodę takePersistableUriPermission():

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);