Por que eu devo ler este artigo:

Os smartphones são plataformas com forte apelo visual, fornecendo ao usuário uma experiência rica de uso. Consequentemente, o uso de imagens e vídeos nos aplicativos facilita seu uso e tem mais apelo entre os usuários. A plataforma Android parece saber desta questão e forneceu um conjunto amplo de API´s para criação e manipulação de mídia. A lista é enorme, mas podemos citar as mais importantes: uso de fotos, vídeos e sons.

Neste artigo objetivamos mostrar justamente este rico conjunto de APIs, focando na captura de áudio e vídeo e suas questões intrínsecas, como por exemplo, permissões do usuário, forma padrão ou customizada e meios de armazenamento. Para solidificar o conhecimento vamos construir um aplicativo simples fotos e vídeos ao longo do texto.


Em que situação o tema é útil

Devido à importância do uso de mídias em aplicativos para smartphones, é de grande valia que profissionais Android dominem estas técnicas, sendo assim, podem se diferenciar dentre as centenas de milhares de opções oferecidas na loja de aplicativos.

O mundo dos smartphones é fortemente baseado no apelo visual. A interface amigável e o refinamento no acabamento de ícones e aplicativos são considerados um grande diferencial. Além disso, este quesito passa a ser quase questão de sobrevivência na medida em que as lojas virtuais se enchem de possibilidades. Pesquisas feitas ainda no final de 2012 davam conta de que as principais lojas, a Google Play e a App Store, tinham cerca de 700.000 aplicativos em cada uma.

A questão visual começa na construção de um bom ícone, afinal, o usuário tem que se sentir atraído pela sua solução dentro de centenas de possibilidades. Segue com a construção de layouts ricos e que facilitem a utilização e navegação do aplicativo. E, para finalizar, pode incluir um intenso uso de imagens e vídeos. Afinal, sempre ouvimos falar que uma imagem vale mais do que mil palavras.

Um bom exemplo disso é o sucesso que aplicativos simples de edição de imagem estão tendo, como o Instagram. A princípio, uma solução fácil de ser implementada, mas com um forte apelo gráfico. E isso se deve também a modernização dos SDKs disponíveis para a grande maioria das plataformas móveis.

Nas plataformas modernas o desenvolvedor tem ao seu alcance um conjunto de bibliotecas que facilitam a integração com o sistema operacional, tornando trivial o processo de requisitar que a câmera capture uma foto e armazene em mídias de armazenamento externas, por exemplo. E mais do que isso, também possibilitam a customização deste processo, podendo utilizar uma camada com ligação direta com hardware juntamente com seu layout de interface gráfica desenvolvido pela equipe de criação.

Um dos exemplos é o Android, que é justamente o tema deste artigo. Nesta plataforma temos a opção de utilizar o conceito de intenções (será melhor detalhado no decorrer do texto), onde, com poucas linhas, requisitamos uma imagem e o próprio sistema operacional se encarrega de retornar o dado solicitado.

Outra possibilidade, que a referida plataforma também oferece, é mostrar uma pré-visualização da câmera e implementarmos o aplicativo de “tirar foto” que desejarmos, desde os mais simples até os mais complexos, com interfaces de usuário extremamente ricas e com utilização até mesmo de sensores.

Soma-se a isso a notável evolução que o hardware dos dispositivos móveis possui, estendendo-se a qualidade da imagem e vídeo que as câmeras dos mesmos conseguem capturar. Hoje em dia é perfeitamente normal abrirmos mão de dispositivos exclusivamente para fotos e em seu lugar utilizarmos o smartphone.

E mais uma vez as plataformas móveis se atentaram a este fato. É comum termos em mãos funções e/ou métodos que possibilitam configurações finas na forma de capturar a foto. O Android, por exemplo, permite reconhecimento facial em tempo real. E isso é apenas uma das possibilidades. Podemos também definirmos nível de zoom e modo de flash, para ficar nos mais conhecidos.

Ou seja, temos um cenário, para desenvolvedores, muito diferente daquele presente há 5, 6 anos. O JavaME, extensamente utilizado em anos anteriores, não oferecia nem metade das possibilidades que Android, iPhone e Windows Phone oferecem. Deixar de utilizá-las em nossos aplicativos nos fará perder tempo, espaço nas lojas e, como consequência final e mais impactante, clientes.

Sendo assim, o objetivo deste artigo é justamente preencher esta lacuna nos conhecimentos do leitor. Pretendemos mostrar de forma clara quais as principais APIs e suas formas de uso para captura de imagens e vídeo na plataforma Android.

Como dito anteriormente, faremos um aplicativo que mostra as quatro possibilidades discutidas ao longo do texto. Duas delas são a captura de fotos e vídeos utilizando os aplicativos nativos do aparelho. Desta forma ganhamos em tempo, porém, ficamos preso a interfaces destes aplicativos e não temos customizações. Por isso, também mostraremos como implementar nossa própria feature de captura de mídia. Consequentemente, teremos mais trabalho mas, em contrapartida, as possibilidades são muito maiores. Como bônus, o leitor poderá ver um pouco sobre a forma de armazenamento em mídias externas, como SDCard por exemplo. Boa leitura.

O projeto

O projeto a ser desenvolvido não tem nenhuma pretensão de se tornar uma aplicação comercial, mas sim, de demonstrar de maneira fácil e organizada as formas de captura de fotos e vídeos na plataforma Android. Na primeira tela (Figura 1) temos um menu com as quatro opções disponíveis.

A primeira opção (Intent-Foto) leva para a tela ilustrada na Figura 2. Depois que o botão for acionado e o aplicativo receber a foto como retorno da Intent populamos a região central. A mesma ideia vale para a opção Intent-Video, que levará o usuário para a tela mostrada na Figura 3. A única diferença é que a região central fica inicialmente preta porque estamos utilizando outro componente de interface gráfica.

Menu Principal
Figura 1. Menu Principal
Captura de Foto por Intent
Figura 2. Captura de Foto por Intent
Captura de Vídeo por Intent
Figura 3. Captura de Vídeo por Intent

Nas opções Professional-Foto e Professional-Video, o usuário será direcionado a uma tela conforme aquela mostrada na Figura 4. A diferença entre ambas é que quando a mídia for capturada a região de preview será substituída pela foto ou pelo vídeo. No caso de foto temos o exemplo na Figura 5.

Captura Profissional de foto e vídeo
Figura 4. Captura “Profissional” de foto e vídeo
Captura de foto por Intent
Figura 5. Captura de foto por Intent

Perceba que não foi feito um trabalho detalhado na interface de usuário, simplesmente porque o foco deste artigo não é este. Também utilizamos componentes de UI tradicionais do Android para não atrapalhar no entendimento do principal, a captura de mídia.

Codificando o projeto

Para melhor visualizar o conjunto de classes e arquivos .xml que iremos construir, observe a Figura 6.

Estrutura de arquivos e diretório do aplicativo
Figura 6. Estrutura de arquivos e diretório do aplicativo

Inicialmente, apenas crie as mesmas sete classes mostradas na figura dentro de um pacote também chamado de com.example.cameraapp. Além disso, também crie arquivos xml com os mesmos nomes vistos no diretório res->layout. Ao longo do artigo vamos populando e entendendo melhor cada um deles.

Como visto nas figuras do aplicativo, a tela inicial será uma lista com quatro opções que direcionam o usuário para outras Activities. Sendo assim, a primeira mudança que podemos efetuar é no AndroidManifest.xml. Observe a Listagem 1.

Nota: Activity na plataforma Android pode ser entendida como uma tela da sua aplicação. Ela possui uma view associada e controla o ciclo de vida e eventos de interação com o usuário nesta mesma tela.
1:  <?xml version="1.0" encoding="utf-8"?>
2:  <manifest xmlns:android="https://schemas.android.com/apk/res/android"
3:    package="com.example.cameraapp"
4:    android:versionCode="1"
5:    android:versionName="1.0" >
6:
7:    <uses-sdk
8:      android:minSdkVersion="9"
9:      android:targetSdkVersion="16" />
10:
11:    <application
12:     android:allowBackup="true"
13:     android:icon="@drawable/ic_launcher"
14:     android:label="@string/app_name"
15:     android:theme="@style/AppTheme" >
16:       <activity
17:         android:screenOrientation="landscape"         
18:         android:name="com.example.cameraapp.ProfessionalVideo"
19:         android:label="@string/app_name" >
20:       </activity>
21:       <activity
22:         android:screenOrientation="landscape"         
23:         android:name="com.example.cameraapp.ProfessionalFoto"
24:         android:label="@string/app_name" >
25:       </activity>
26:       <activity         
27:         android:name="com.example.cameraapp.IntentFoto"
28:         android:label="@string/app_name" >
29:       </activity>
30:       <activity         
31:         android:name="com.example.cameraapp.IntentVideo"
32:         android:label="@string/app_name" >
33:       </activity>
34:       <activity         
35:         android:name="com.example.cameraapp.Menu"
36:         android:label="@string/app_name" >
37:       <intent-filter>
38:         <action android:name="android.intent.action.MAIN" />
39:         <category android:name="android.intent.category.LAUNCHER" />
40:       </intent-filter>
41:     </activity>
42:  </application>
43: </manifest>
Listagem 1. AndroidManifest.xml

Na primeira linha temos o padrão do documento xml. Na linha 2 temos a tag raiz do manifesto, onde definimos o pacote da aplicação na linha 3, e o código e nome da versão do código que estamos desenvolvendo, isso nas linhas 4 e 5, respectivamente.

Na linha 7 temos a tag ­uses-sdk. Nela, estamos definindo que o aplicativo estará disponível a partir da api level 9 do Android (linha 8). Este número inteiro indica a versão do sistema operacional. Ele teve como base o Android 1.0 e, consequentemente, o api level 1. Depois, a cada nova versão disponibilizada este nível de API era acrescentado em 1. O 9 indica o android 2.3.3, ou, mais conhecido com o nome de Gingerbread.

Já na linha 9 especificamos que nossa versão de SDK alvo é aquela identificada com o api level 16, que se refere às versões 4.1 e 4.1.1 do Android, mais conhecidas como JellyBean.

A tag application, iniciada na linha 11, serve para definição de características comuns no aplicativo como o ícone (linha 12), rótulo (linha 13) e tema (linha 14). Perceba que em todos os casos estamos apontando para recursos da própria aplicação, isto é, estão dentro do diretório ...

Quer ler esse conteúdo completo? Seja um assinante e descubra as vantagens.
  • 473 Cursos
  • 10K Artigos
  • 100 DevCasts
  • 30 Projetos
  • 80 Guias
Tenha acesso completo