Selector de fotos

Aparece el diálogo del selector de fotos con archivos multimedia en tu dispositivo. Selecciona una foto para compartirla con la app.
Figura 1. El selector de fotos ofrece una IU intuitiva para compartir fotos con la app.

Android 13 (nivel de API 33) admite una nueva herramienta para la selección de fotos. Esta herramienta proporciona una forma integrada y segura para que los usuarios seleccionen archivos multimedia, sin necesidad de otorgarle a tu app acceso a toda su biblioteca multimedia.

Selección de contenido multimedia

El selector de fotos ofrece una interfaz de búsqueda explorable que le presenta al usuario su biblioteca multimedia, ordenada por fecha (de lo más reciente a lo más antiguo). Puedes especificar que los usuarios solo vean fotos o solo videos y que se establezca en 1 la cantidad máxima de selecciones de contenido multimedia que se permita de forma predeterminada.

Define las limitaciones de uso compartido

Las apps pueden declarar un valor para android.provider.extra.PICK_IMAGES_MAX, que indica la cantidad máxima de archivos multimedia que aparecen en el selector de fotos cuando se muestran al usuario. Por ejemplo, si le solicitas a un usuario que seleccione una foto de perfil requerida para su cuenta, configura una foto como requisito máximo del uso compartido.

Para iniciar el selector de fotos en el modo de selección única, haz lo siguiente:

Kotlin

// Launches photo picker in single-select mode.
// This means that the user can select one photo or video.
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
startActivityForResult(intent, PHOTO_PICKER_REQUEST_CODE)

Java

// Launches photo picker in single-select mode.
// This means that the user can select one photo or video.
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
startActivityForResult(intent, PHOTO_PICKER_REQUEST_CODE);

Selecciona varias fotos o videos

Si el caso de uso de tu app requiere que el usuario seleccione varias fotos o videos, puedes especificar la cantidad máxima de imágenes que deben aparecer en el selector de fotos con EXTRA_PICK_IMAGES_MAX adicional, como se muestra en el siguiente código fragmento:

Kotlin

// Launches photo picker in multi-select mode.
// This means that user can select multiple photos/videos, up to the limit
// specified by the app in the extra (10 in this example).
val maxNumPhotosAndVideos = 10
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos)
startActivityForResult(intent, PHOTO_PICKER_MULTI_SELECT_REQUEST_CODE)

Java

// Launches photo picker in multi-select mode.
// This means that user can select multiple photos/videos, up to the limit
// specified by the app in the extra (10 in this example).
final int maxNumPhotosAndVideos = 10;
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos);
startActivityForResult(intent, PHOTO_PICKER_MULTI_SELECT_REQUEST_CODE);

Ten en cuenta que existe un límite de la plataforma en el número más grande que puedes especificar como una cantidad máxima de archivos. Para acceder a este límite, llama a MediaStore#getPickImagesMaxLimit().

Controla los resultados del selector de fotos

Después de iniciar el selector de fotos, usa el nuevo intent ACTION_PICK_IMAGES para controlar los resultados. El selector muestra un conjunto de URI:

Kotlin

// onActivityResult() handles callbacks from the photo picker.
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    super.onActivityResult(requestCode, resultCode, data)
    if (resultCode != Activity.RESULT_OK) {
        // Handle error
return
    }
    when (requestCode) {
            REQUEST_PHOTO_PICKER_SINGLE_SELECT -> {
            // Get photo picker response for single select.
            val currentUri: Uri = data.data

            // Do stuff with the photo/video URI.
            return
        }
                REQUEST_PHOTO_PICKER_MULTI_SELECT -> {
            // Get photo picker response for multi select.
            var i = 0
            while (i < data.clipData!!.itemCount) {

Java

// onActivityResult() handles callbacks from the photo picker.
@Override
protected void onActivityResult(
    int requestCode, int resultCode, final Intent data) {

    if (resultCode != Activity.RESULT_OK) {
        // Handle error
        return;
    }

    switch(requestCode) {
        case REQUEST_PHOTO_PICKER_SINGLE_SELECT:
            // Get photo picker response for single select.
            Uri currentUri = data.getData();

            // Do stuff with the photo/video URI.
            return;
        case REQUEST_PHOTO_PICKER_MULTI_SELECT:
            // Get photo picker response for multi select
            for (int i = 0; i < data.getClipData().getItemCount(); i++) {
                Uri currentUri = data.getClipData().getItemAt(i).getUri();

                // Do stuff with each photo/video URI.
            }
            return;
    }
}

De forma predeterminada, el selector de fotos muestra fotos y videos. También puedes filtrar solo por fotos o solo videos mediante la configuración de un tipo de MIME en el método setType(). Por ejemplo, para mostrar solo los videos en el selector de fotos, pasa video/* a setType():

Kotlin

// Launches photo picker for videos only in single select mode.
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
intent.type = "video/*"
startActivityForResult(intent, PHOTO_PICKER_VIDEO_SINGLE_SELECT_REQUEST_CODE)

// Apps can also change the mimeType to allow users to select
// images only - intent.type = "images/*"

Java

// Launches photo picker for videos only in single select mode.
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.setType("video/*");
startActivityForResult(intent, PHOTO_PICKER_VIDEO_SINGLE_SELECT_REQUEST_CODE);

// Apps can also change the mimeType to allow users to select
// images only - intent.setType("image/*");
// or a specific mimeType - intent.setType("image/gif");