Seletor de fotos

A caixa de diálogo do seletor de fotos aparece com arquivos de mídia do dispositivo. Selecione uma foto para compartilhar com o app.
Figura 1. O seletor de fotos oferece uma IU intuitiva para compartilhar fotos com o app.

O Android 13 (API de nível 33) inclui suporte a uma nova ferramenta de seleção de fotos. Essa ferramenta oferece uma maneira segura e integrada para os usuários selecionarem arquivos de mídia, sem precisar conceder ao app acesso a toda a biblioteca de mídia.

Seleção de mídia

O seletor de fotos oferece uma interface visualizável e pesquisável que apresenta ao usuário a biblioteca de mídia, classificada por data, da mais recente para a mais antiga. Você pode especificar que os usuários vejam apenas fotos ou apenas vídeos, e o número máximo de seleções de mídia permitidas por padrão é 1.

Definir limites de compartilhamento

Os apps podem declarar um valor para android.provider.extra.PICK_IMAGES_MAX, que indica o número máximo de arquivos de mídia que aparecem no seletor de fotos quando mostrado ao usuário. Por exemplo, se você solicitar que um usuário selecione uma foto de perfil necessária para a conta dele, defina uma foto como o requisito máximo de compartilhamento.

Para iniciar o seletor de fotos no modo de seleção única, faça o seguinte:

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

Selecionar várias fotos ou vídeos

Se o caso de uso do app exige que o usuário selecione várias fotos ou vídeos, você pode especificar o número máximo de imagens que aparecem no seletor usando o extra EXTRA_PICK_IMAGES_MAX, conforme mostrado no snippet de código abaixo:

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

Não se esqueça que há um limite de plataforma para o maior número que você pode especificar como um número máximo de arquivos. Para acessar esse limite, chame o método MediaStore#getPickImagesMaxLimit().

Gerenciar os resultados do seletor de fotos

Após iniciar o seletor de fotos, use a nova intent ACTION_PICK_IMAGES para processar os resultados. O seletor retorna um conjunto de URIs:

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

Por padrão, o seletor mostra fotos e vídeos. Você também pode filtrar apenas por fotos ou por vídeos definindo um tipo MIME no método setType(). Por exemplo, para mostrar apenas vídeos no seletor de fotos, transmita video/* para 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");