Pemilih foto

Dialog pemilih foto akan muncul dengan file media di perangkat Anda. Pilih foto untuk dibagikan ke aplikasi.
Gambar 1. Pemilih foto menyediakan UI yang intuitif untuk berbagi foto ke aplikasi Anda.

Pemilih foto menyediakan antarmuka yang dapat ditelusuri yang menyajikan library media kepada pengguna, yang diurutkan berdasarkan tanggal dari yang terbaru hingga terlama. Seperti yang ditunjukkan dalam codelab praktik terbaik privasi, pemilih foto menyediakan cara bawaan yang aman bagi pengguna untuk memberikan aplikasi Anda akses ke hanya gambar dan video yang dipilih, bukan seluruh koleksi media mereka.

Pengguna yang memiliki penyedia media cloud yang memenuhi syarat di perangkat mereka juga dapat memilih dari foto dan video yang disimpan dari jarak jauh. Pelajari penyedia media cloud lebih lanjut.

Alat ini otomatis diupdate, menawarkan fungsi yang diperluas kepada pengguna aplikasi Anda dari waktu ke waktu tanpa memerlukan perubahan kode apa pun.

Menggunakan kontrak Aktivitas Jetpack

Untuk menyederhanakan integrasi pemilih foto, sertakan library androidx.activity versi 1.7.0 atau yang lebih baru.

Gunakan kontrak hasil aktivitas berikut untuk meluncurkan pemilih foto:

Jika pemilih foto tidak tersedia di perangkat, library akan otomatis memanggil tindakan intent ACTION_OPEN_DOCUMENT. Intent ini didukung pada perangkat yang menjalankan Android 4.4 (API level 19) atau yang lebih baru. Anda dapat memverifikasi apakah pemilih foto tersedia di perangkat tertentu dengan memanggil isPhotoPickerAvailable().

Memilih satu item media

Untuk memilih satu item media, gunakan kontrak hasil aktivitas PickVisualMedia, seperti yang ditunjukkan dalam cuplikan kode berikut:

View

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

Penayangan

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

Compose

// Registers a photo picker activity launcher in single-select mode.
val pickMedia = rememberLauncherForActivityResult(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)))

Memilih beberapa item media

Untuk memilih beberapa item media, tetapkan jumlah maksimum file media yang dapat dipilih, seperti yang ditunjukkan dalam cuplikan kode berikut.

View

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

Penayangan

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

Compose

// 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 =
        rememberLauncherForActivityResult(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))

Platform ini membatasi jumlah maksimum file yang dapat Anda minta untuk dipilih pengguna dalam pemilih foto. Untuk mengakses batas ini, panggil getPickImagesMaxLimit(). Pada perangkat yang tidak mendukung pemilih foto, batas ini akan diabaikan.

Ketersediaan perangkat

Pemilih foto tersedia di perangkat yang memenuhi kriteria berikut:

Perangkat lama yang menjalankan Android 4.4 (API level 19) hingga Android 10 (API level 29) dan perangkat Android Go yang menjalankan Android 11 atau 12 yang mendukung layanan Google Play dapat menginstal pemilih foto versi backport. Untuk mengaktifkan penginstalan otomatis modul pemilih foto yang di-backport melalui layanan Google Play, tambahkan entri berikut ke tag <application> dalam file manifes aplikasi:

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

Mempertahankan akses file media

Secara default, sistem memberi aplikasi Anda akses ke file media hingga perangkat dimulai ulang atau hingga aplikasi berhenti. Jika aplikasi Anda melakukan pekerjaan yang berjalan lama, seperti mengupload file besar di latar belakang, Anda mungkin memerlukan akses ini untuk dipertahankan dalam jangka waktu yang lebih lama. Untuk melakukannya, panggil metode 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);