Álbum de fotos no Android
Veremos como é simples selecionar uma imagem do álbum do Android e colocar na nossa app
No nosso curso Desenvolvimento de Aplicações com Android em um determinado momento aprendemos como implementar na nossa App o recurso de tirar uma foto usando claro, a câmera do aparelho.
Porém, alguns alunos perguntam como seria para acessar a galeria, uma imagem ou foto que está no álbum etc. Será que é fácil? Tem como deixar as duas funcionalidades na mesma Activity?
Bem, neste artigo iremos ver como é simples acessar o álbum do Android diretamente da nossa App.
Para facilitar o entendimento neste artigo, não iremos focar na criação do projeto, nem detalhes relacionados ao projeto, vamos direto para a funcionalidade. Mas não se preocupe, o projeto está no GitHub para que você possa baixá-lo e testar como quiser.
Configuração inicial
Criamos um projeto no Android Studio com as seguintes configurações:
- Android Studio 2.2
- SDK Java 1.8
- API 25: Android 7.1.1 (Nougat)
- Min SDK: API 16: Android 4.1 (Jelly Bean)
- Base Activity
A nossa VIEW
Não iremos mexer na estrutura que o Android Studio cria, que são dois arquivos: activity_camera.xml
e o content_camera.xml
. Iremos apenas adicionar dois componentes no content_camera.xml
:
ImageView
: Onde queremos que a imagem seja carregada;Button
: que irá acionar a nossa funcionalidade.
ImageView
<ImageView
android:id="@+id/foto"
android:layout_width="match_parent"
android:layout_height="275dp"
android:src="@drawable/logo" <-- não se preocupe a logo está no github
android:background="@color/colorPrimaryDark"/>
Button
<Button
android:text="Carregar imagem..."
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="17dp"
android:id="@+id/btn"
android:layout_below="@+id/foto"
android:layout_centerHorizontal="true" />
São dois componentes simples e que você poderá substituir por um de sua preferência. Teremos uma tela semelhante a essa:
Criando a ação: CameraActivity.java
A nossa Activity, por ter sido criada no Android Studio já vem com alguns códigos, pode ignorá-los por enquanto. Vamos ao onCreate
que é o que importa:
Teremos dois atributos de classe:
public class CameraActivity extends AppCompatActivity {
private Bitmap bitmap;
private Button btn;
...
}
Agora no onCreate
iremos com o findViewById
pegar esses componentes no Java. Observe que iremos colocar aqui apenas o código pertinente a nossa funcionalidade.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
img = (ImageView) findViewById(R.id.foto);
btn = (Button) findViewById(R.id.btn);
}
Iremos agora implementar o setOnClickListener
para adicionarmos a ação do botão. Para este exemplo iremos utilizar um ContextMenu
, mas você pode fazer da maneira que desejar, isso não muda pois é apenas o que irá acionar a funcionalidade.
btn.setOnClickListener(new View.OnClickListener() {
registerForContextMenu(btn);
openContextMenu(btn);
});
Lembre-se que para utilizar um context menu, precisamos registar o mesmo, onde queremos que esse contexto seja carregado, no caso no botão. Para isso usaremos o registreForContextMenu
e ao acionar o botão queremos que o mesmo seja exibido, então colocamos o openContextMenu
. Todos dentro do onClick
.
Agora precisamos implementar o onCreateContextMenu
. Que sabemos é onde as opções/itens do menu serão adicionados. Neste iremos implementar um MenuItem
que será para o nosso item dee já iniciar a implementação do setOnMenuItemClickListener
deste menu.
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuItem carregarImg = menu.add("da Galeria");
carregarImg.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return false;
}
});
}
Veja como a nossa tela está ficando:
Por questão de organização vamos criar um método que irá selecionar a imagem no álbum, o método selecionarGaleria()
:
public void selecionarGaleria(){
}
Abrindo a galeria
Assim como para selecionar uma câmera ou alguma outra ação, usaremos uma Intent
, porém faremos com o Intent.ACTION_GET_CONTENT
que irá nos permitir abrir a pasta de arquivos, que permite que você possa escolher um deles e assim ele retornaria a URL para quem o chamou.
Intent abrirGaleria = new Intent(Intent.ACTION_GET_CONTENT);
Além disso teremos que definir um tipo (MIME) de dados explicitamente, no nosso caso seria image/*
, onde queremos apenas imagens e não arquivos qualquer. Caso você deseja-se por exemplo qualquer arquivo poderia usar */*
.
intent.setType("image/*");
MIME tipo de próprio do Android. E é sensível a maiúsculas, ao contrário de tipos formais RFC MIME. Como resultado, você deve sempre escrever seus tipos MIME com letras minúsculas, ou usar
normalizeMimeType (String)
ousetTypeAndNormalize (String)
para garantir que ele é convertido para minúsculas.
Precisamos também definir uma categoria já que estaremos utilizando um GET_CONTENT
então é desejável que você escolha dados do tipo stream, por isso na categoria definimos um Intent.CATEGORY_OPENABLE
.
intent.addCategory(Intent.CATEGORY_OPENABLE);
E para finalizar basta usar o startActivityForResult
assim como na funcionalidade de câmera por exemplo(para quem fez o curso). Veja como será o nosso método.
public void selecionarGaleria(){
Intent abrirGaleria = new Intent(Intent.ACTION_GET_CONTENT);
abrirGaleria.setType("image/*");
abrirGaleria.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(abrirGaleria,CODIGO_GALERIA);
}
Agora basta chamar o método no MenuItem
MenuItem carregarImg = menu.add("da Galeria");
carregarImg.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
selecionarGaleria();
return false;
}
});
ActivityResult
Agora vamos implementar o onActivityResult
, que será a ação tomada após selecionar a imagem. Nele iremos chamar um método (que ainda iremos fazer) que será responsável em exibir a imagem no ImageView
da Activity, o método carregarImagemGaleria()
que terá como parâmetro a intent (Intent data
).
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CODIGO_GALERIA && resultCode == RESULT_OK) {
carregarImagemGaleria(data);
}
}
Carregando a imagem no ImageView
da sua APP:
Aqui não tem muito segredo, é basicamente como manipular arquivos no Java.
public void carregarImagemGaleria(Intent data){
InputStream stream = null;
try {
if(bitmap != null){
bitmap.recycle();
}
stream = getContentResolver().openInputStream(data.getData());
bitmap = BitmapFactory.decodeStream(stream);
img.setImageBitmap(bitmap);
exibirMsg("Imagem da GALERIA carregada..."); //método criado logo abaixo, apenas para carregar uma mensagem de sucesso.
} catch(FileNotFoundException e) {
e.printStackTrace();
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Método
recycle()
: Basicamente esse método irá liberar as referências de forma síncrona e é uma maneira simples do GC verificar se não existem outras referências. Esta é uma chamada avançada e normalmente não precisa ser chamada, já que o processo GC normal irá liberar essa memória quando não há mais referências a este bitmap. Porém, caso você o faça, lembre-se de verificar se obitmap
não estánull
e que você tenha certeza que deseja marcá-lo como "morto" para que possa ser usado(instanciado) um novo por cima.
E fizemos também um método exibirMsg
que será responsável apenas em dar uma mensagem de sucesso.
public void exibirMsg(String msg){
View viewById = findViewById(R.id.content_camera);
Snackbar.make(viewById, msg, Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
Permissões no Android
Como iremos acessar um recurso do Android, precisamos adicionar uma permissão, na verdade um pedido de permissão, para que o usuário aceite a mesma. A partir do Android 5.0 precisamos além de adicionar essa permissão no AndroidManifest.xml
precisamos também, caso não desejamos que o usuário faça manualmente, que a aplicação solicite a mesma. Vamos primeiro fazer a do xml.
No AndroidManifest.xml
adicionamos a permissão, essa sempre será obrigatória.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Agora precisamos programaticamente, adicionar a permissão na funcionalidade. Podemos fazer esse código em qualquer local, seja na inicialização da app, etc. No nosso caso queremos verificar e solicitar a permissão do usuário para que possamos acessar esse recurso, no momento que ele solicitar fazer o mesmo. Ou seja, no clique no botão.
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//aqui ele verifica se o usuário já deu a permissão....
if (ActivityCompat.checkSelfPermission(CameraActivity.this,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//e caso ainda não tenha dado, ele solicita...
ActivityCompat.requestPermissions(CameraActivity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}else{
//ao executar novamente ele irá verificar que já foi dado a permissão e irá executar a funcionalidade normalmente
registerForContextMenu(btn);
openContextMenu(btn);
}
}
});
Ao executar pela primeira vez a funcionalidade do botão, teremos:
Veja outras telas da aplicação.
Finalizando
Vimos uma das maneiras mais simples de acessar uma imagem no álbum do Android. No projeto que está no GitHub ainda possui a funcionalidade de tirar a foto, unindo as duas em uma só tela.
Você verá como é simples tanto a que vimos aqui neste artigo, como a que vimos no curso da TriadWorks. Se quiser saber mais, também tem um tutorial bacana do próprio Android aqui onde também já mostra uma outra forma, tanto para pegar a imagem quanto para tirar uma foto.
O que é importante frisar é o conteúdo base, perceba que temos praticamente os mesmos conceitos, mudando as vezes apenas a API (classes, métodos).
Quer aprender a fazer esses e outros recursos do Android? Da uma olhada no nosso curso da TriadWorks que preparamos exatamente com esse objetivo, para que você entenda como criar aplicações para Android e seus principais recursos.
E ai? Você conhece outra forma de carregar imagens na APP?
Abraços!
You might also be interested in these articles...
Desenvolvedor, Fundador da TriadWorks e da JavaCE
Posted in: androidconstantescursoensinoenumfortalezajavamobile editionooorientação a objetostreinamentotriadworksxml