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