Você está na página 1de 33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

Usando a cmera no Android (Traduo da


documentao oficial)

OFERTA

RELMPAGO

DELL

Inspiron 14 Srie 3000 com HD500, Frete Grtis e Intel Core. Veja!

O framework do Android inclui suporte para vrias cmeras e recursos de


cmera disponveis em dispositivos diversos, permitindo que voc capture
imagens e vdeos em suas aplicaes. Esse artigo ir mostra de forma rpida e
simples como capturar imagens e vdeos e mostrar uma abordagem avanada
para criar experincias personalizadas utilizando a cmera aos usurios de seu
aplicativo.

Consideraes
Antes de permitir que sua aplicao use a cmera do dispositivo Android, voc
deve considerar algumas poucas questes sobre como seu aplicativo pretende
usar esse recurso de hardware.
Obrigatoriedade da Cmera O uso da cmera importante o bastante para
sua aplicao de forma que voc no queira permitir que ela seja instalada
em dispositivos que no possuam cmera? Em caso positivo, voc deve
declarar a obrigatoriedade da cmera em seu manifesto.
Imagem rpida ou cmera personalizada Como a sua aplicao usar a
cmera? Voc est interessado apenas em obter uma imagem ou vdeo de
forma rpida ou sua aplicao fornecer uma nova forma de usar a cmera?
Para obter uma imagem ou vdeo de forma rpida, considere os
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

1/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

procedimentos descritos na seo Usando aplicativos existentes de cmera.


Para desenvolver um recurso personalizado, cheque a seo Criando um
aplicativo de cmera.
Armazenamento As imagens e vdeos geradas pela sua aplicao devem
estar disponveis apenas para ela ou devem ser compartilhadas como outros
aplicativos, como o Gallery ou outro tipo de aplicativo? Voc quer que as
imagens e vdeos permaneam disponveis mesmo aps a remoo do
aplicativo? Veja a seo Salvando os arquivos para ver como implementar
essas opes.

O bsico
O framework do Android suporta a captura de imagens e vdeos atravs da
API Camera ou do Intent da cmera. Abaixo seguem as classes relevantes:
Camera
Essa classe a API primria para controlar a cmera do dispositivo. Essa classe
usada para tirar fotos e vdeos quando se est construindo uma aplicao de
cmera.
SurfaceView
Essa classe usada para apresentar a pr-visualizao da cmera ao usurio.
MediaRecorder
Essa classe usada para gravar vdeo a partir da cmera.
Intent
Um intent do
tipo MediaStore.ACTION_IMAGE_CAPTURE ou MediaStore.ACTION_VIDEO_CAPTURE pode
ser usado para capturar imagens e vdeos sem usar diretamente o objeto Camera.

Declaraes no Manifesto
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

2/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

Antes de comear o desenvolvimento de sua aplicao com a API da Cmera,


voc precisa se certificar que o seu arquivo de manifesto possui as declaraes
necessrias para permitir o uso do hardware da cmera e outros recursos
relacionados.
Permisses da Cmera Sua aplicao precisa requerer permisso para
usar a cmera do dispositivo.
<uses-permission android:name="android.permission.CAMERA" />

Nota: Se voc estiver usando a cmera via intent, no precisa dessa permisso.
Recursos da Cmera Sua aplicao precisa declarar o uso do recursos da
cmera, por exemplo:
<uses-feature android:name="android.hardware.camera" />

Para uma lista de recursos de cmera, veja o manifesto Features Reference.


Adicionar recursos de cmera ao seu manifesto faz com que o Google Play
evite que sua aplicao seja instalada em dispositivos que no suportem os
recursos de cmera que voc especificar. Para mais informaes sobre o filtro
baseado nos recursos utilizados do Google Play, veja Google Play and FeatureBased Filtering.
Se a sua aplicao puder usar uma cmera ou um recurso da cmera para
operar de forma adequada, mas no necessitar desse recurso voc deve
especificar isso no manifesto pela incluso do atributo android:required e o
ajuste dele para o valor false:

<uses-feature android:name="android.hardware.camera"
android:required="false" />

Permisses para armazenamento Se a sua aplicao salva as imagens e


vdeos no armazenamento externo (Carto SD), voc deve especificar isso no
manifesto.
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Permisses para gravao de udio Para gravar udio junto com o vdeo
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

3/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

capturado, sua aplicao precisa requerer permisso para captura de udio.


<uses-permission android:name="android.permission.RECORD_AUDIO" />

Permisso para Geolocalizao Se sua aplicao anexa a geolocalizao da


imagem junto com ela, precisa requisitar permisso para geolocalizao:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
/>

Usando Aplicativos de Cmera existentes


Uma forma rpida para permitir que a sua aplicao tirar fotos ou vdeos sem ter
que criar muito cdigo extra usar um Intent para invocar uma aplicao de
cmera existente do Android. Um intent de cmera faz uma requisio para
capturar uma imagem ou clip de vdeo atravs de uma aplicao de cmera
existente e em seguida retorna para a aplicao. Essa seo mostra como
capturar uma imagem ou vdeo usando essa tcnica.
O procedimento para invocar um intent de cmera segue os seguintes passos:
1. Criar um Intent de cmera Crie um Intent que represente uma imagem ou
vdeo, usando um desses tipos de intent:
MediaStore.ACTION_IMAGE_CAPTURE tipo para requisitar uma imagem a
partir de uma aplicao de cmera existente.
MediaStore.ACTION_VIDEO_CAPTURE tipo para requisitar um vdeo a partir de
uma aplicao de cmera existente.
2. Iniciar o Intent da cmera Use o mtodo startActivityForResult() para
executar o intent da cmera. Aps iniciar o intent, a interface da Cmera
aparece na tela do dispositivo e o usurio pode tirar uma foto ou vdeo.
3. Recepcionar o Resultado da Intent Configure um
mtodo onActivityResult() em sua aplicao para receber a resposta e os
dados do intent da cmera. Quando o usurio termina de tirar a foto ou vdeo
(ou cancela a operao), o sistema chama esse mtodo imediatamente.

Intent de captura de imagem


http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

4/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

Capturar imagens usando um intent de cmera a forma mais rpida de


permitir que sua aplicao tire fotos com o mnimo de codificao. Um intent de
captura de imagens pode incluir as seguintes informaes extras:
MediaStore.EXTRA_OUTPUT Esse ajuste necessita de um objeto Uri que
especifica um caminho e um nome de arquivo onde voc gostaria de salvar a
imagem. Essa configurao opcional mas fortemente recomendada. Se voc
no precisar especificar esse valor, a aplicao da cmera salva a imagem
requisitada no local padro com um nome padro, especificado no
campo Intent.getData() dointent.
O exemplo seguinte demonstra como criar um intent de captura de imagem e
execut-lo. O mtodo getOutputMediaFileUri() desse exemplo refere-se ao cdigo
fonte exemplo mostrado em Salvando arquivos de mdia.

private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;


private Uri fileUri;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// create Intent to take a picture and return control to the calling
application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to
save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image
file name
// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}

Quando um mtodo startActivityForResult() executado, os usurios vero a


interface da cmera. Depois que o usurio termina de tirar a foto (ou cancela a
operao), a interface retorna para sua aplicao, e voc precisa interceptar o
mtodo onActivityResult() para receber o resultado do intent e continuar a
execuo de sua aplicao. Para informaes de como receber o
intent completado, veja Receiving camera intent result.

Intent de captura de vdeo


http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

5/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

Capturar vdeo usando um intent de cmera a forma mais rpida de permitir


que a sua aplicao tire vdeos com a mnima quantidade de cdigo. Um intent de
captura de vdeo pode incluir as seguintes informaes extras:
MediaStore.EXTRA_OUTPUT Essa configurao necessita de um Uri que
especifica um caminho e um nome de arquivo onde voc gostaria de salvar o
vdeo. Essa configurao opcional mas fortemente recomendada. Se voc
no especificar esse valor, a aplicao da Cmera salva o vdeo requisitado no
local padro com um nona padro especificado no campo Intent.getData() do
intent.
MediaStore.EXTRA_VIDEO_QUALITY Esse valor pode ser ser 0 para a menor
qualidade e arquivos menores ou 1 para para a melhor qualidade e arquivo
maiores.
MediaStore.EXTRA_DURATION_LIMIT Configure esse valor para o limite de
tamanho, em segundos, do vdeo a ser capturado.
MediaStore.EXTRA_SIZE_LIMIT Configure esse valor para o limite, em bytes, do
arquivo a ser capturado.
O exemplo a seguir demonstra como criar um intent de captura de vdeo e
executa-lo. O mtodo getOutputMediaFileUri() nesse exemplo refere-se ao cdigo
fonte exemplo mostrada em Saving Media Files.

private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;


private Uri fileUri;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//create new Intent
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);
to save the video
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
file name

// create a file
// set the image

intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video


image quality to high
// start the Video Capture Intent
startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
}

http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

6/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

Quando o mtodo startActivityForResult() executado, os usurios vero a


interface da aplicao de cmera. Depois que o usurio termina de gravar o
vdeo (ou cancela a operao), a interface retorna para para sua aplicao, e voc
precisa interceptar o mtodo onActivityResult() para receber o resultado do
intent e continuar a execuo de sua aplicao. Para obter informaes de como
fazer isso, veja a seo a seguir.

Recebendo o resultado do Intent da cmera


Uma vez que voc criou e executou o intent para captura de imagem ou vdeo,
sua aplicao precisa estar configurada para receber o resultado do intent. Essa
seo descreve como interceptar o resultado de um intent da cmerade forma
que sua aplicao possa executar o processamento dessa imagem ou vdeo
capturado.
De forma a receber o resultado de um intent, voc precisa sobrecarregar o
mtodo onActivityResult() na Activity que iniciou o intent. O exemplo a seguir
demonstra como sobrecarregar esse mtodo para capturar o resultado dos
exemplos de captura de imagem ou captura de vdeo das sees anteriores.

private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;


private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent
data) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Image captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Image saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
} else {
// Image capture failed, advise user
}
}
if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Video captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Video saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the video capture
} else {
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

7/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

// Video capture failed, advise user


}
}
}

Uma vez que a sua Activity receba o resultado com sucesso, a imagem ou vdeo
capturado estar disponvel no local especificado para acesso pela sua aplicao.

Criando um aplicativo de cmera


Alguns desenvolvedores podem precisar de uma interface de cmera que seja
personalizada a aparncia de suas aplicaes ou fornea recursos especiais. Criar
um Activity de cmera personalizada necessita de mais cdigo do que o uso de
um intent, mas pode fornecer uma experincia melhor ao usurio.
Os passos gerais para criar uma interface personalizada da cmera para sua
aplicao so os seguintes:
Detectar e acessar a cmera Criar o cdigo para verificar a existncia de
cmeras e solicitar acesso.
Criar uma classe de pr-visualizao Criar um classe de pr-visualizao
que estenda SurfaceView e implemente a interface SurfaceHolder. Essa classe
visualiza imagens ao vivo da cmera.
Criar o layout da pr-visualizao Uma vez que voc tenha a classe de prvisualizao, crie um layout que incorpore a pr-visualizao e os controles
que voc deseja.
Ajustar os ouvintes para a captura Conecte os ouvintes para que os
controles de sua interface possam iniciar a captura da imagem ou vdeo em
resposta a alguma ao, como pressionar um boto.
Capturar e salvar aqquivos Configure o cdigo para capturar images e
vdeos e salvar a sada.
Liberar a cmera Depois de usar a cmera, sua aplicao precisa libera-la
adequadamente para que outras aplicaes possam usa-la.
O hardware da cmera um recurso compartilhado que precisa ser gerenciado
cuidadosamente de forma que a sua aplicao no colida com outras aplicaes
que tambm queiram usa-lo. As sees a seguir discutem como detectar o
hardware da cmera, como solicitar acesso a cmera, como capturar imagens e
vdeos e como liberar a cmera quando sua aplicao no estiver mais usando
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

8/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

ela.
Cuidado: Lembre de liberar o objeto Camera pela chamada
Camera.release() quando sua aplicao tiver finalizado o uso da cmera. Se sua
aplicao no liberar a cmera adequadamente, todas as tentativas subsequentes
de acesso a cmera, incluindo os da sua prpria aplicao, iro falhar e podem
fazer com que tanto sua aplicao quanto as outras fechem.

Detectando o hardware da cmera


Se a sua aplicao no solicita a cmera usando uma declarao no manifesto,
voc deve verificar para verificar se existe uma cmera em tempo de execuo.
Para executar essa checagem, use o mtodo PackageManager.hasSystemFeature(),
como mostrado no cdigo abaixo:

/** Check if this device has a camera */


private boolean checkCameraHardware(Context context) {
if
(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMER
A)){
// this device has a camera
return true;
} else {
// no camera on this device
return false;
}
}

Dispositivos Android podem ter mltiplas cmeras, por exemplo, uma cmera na
parte de trs para fotografia e uma cmera frontal para videochamadas. O
Android 2.3 (API Level 9) e superiores permitem que voc verifiquem o nmero
de cmeras disponveis em um dispositivo usando o
mtodo Camera.getNumberOfCameras().

Acessando a cmera
Se voc determinar que o dispositivo onde sua aplicao est sendo executada
possui uma cmera, voc precisa solicitar acesso a ela pela obteno de uma
instncia de Camera (a menos que esteja usando um intent de acesso a cmera).
Para acessar a cmera primria, use o mtodo Camera.open() e certifique-se de
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

9/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

capturar qualquer exceo, como mostrado no cdigo abaixo:

/** A safe way to get an instance of the Camera object. */


public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open(); // attempt to get a Camera instance
}
catch (Exception e){
// Camera is not available (in use or does not exist)
}
return c; // returns null if camera is unavailable
}

Cuidado: Sempre cheque por excees quando usar Camera.open(). No checar


por excees quando a cmera estiver em uso ou no exista acarretar no
encerramento de sua aplicao pelo sistema.

klebermota.eti.br

Blogsobrecincia,computaoeprojetosrelacionados

Em dispositivos rodando o Android 2.3 (API Level 9) ou superior, voc pode


acessar cmeras especificas usando Camera.open(int). O exemplo de cdigo acima
ir acessar a primeira cmera, na parte de trs, em um dispositivo com mais de
uma cmera.

Verificando os recursos da cmera


Uma vez que voc tenha obtido a uma cmera, voc pode obter informaes
sobre os seus recursos usando o mtodo Camera.getParameters() e verificando o
retorno do objeto Camera.Parameters por recursos suportados. Quando estiver
usando a API Level 9 ou superior, use Camera.getCameraInfo() para determinar se
a cmera est na parte da frente ou de trs, e a orientao da imagem.

Criando uma classe para pre-visualizao


Para que os usurios tirem efetivamente fotos e vdeos, eles precisam serem
capazes de ver o que a cmera v. Uma classe de pr-visualizao
um SurfaceView que pode exibir os dados de imagem vindos da cmera, de forma
que os usurios possam enquadrar e capturar um imagem ou vdeo.
O exemplo de cdigo a seguir demonstra como criar uma classe de prvisualizao bsica que pode ser includa em um layout. Essa classe
implementa SurfaceHolder.Callback de forma a poder capturar eventos para a
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

10/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

criao e destruio do view, que necessrio para atribuir a entrada da prvisualizao da cmera.

/** A basic Camera preview class */


public class CameraPreview extends SurfaceView implements
SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraPreview(Context context, Camera camera) {
super(context);
mCamera = camera;
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
// deprecated setting, but required on Android versions prior to
3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, now tell the camera where to draw
the preview.
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// empty. Take care of releasing the Camera preview in your
activity.
}
public void surfaceChanged(SurfaceHolder holder, int format, int w,
int h) {
// If your preview can change or rotate, take care of those events
here.
// Make sure to stop the preview before resizing or reformatting
it.
if (mHolder.getSurface() == null){
// preview surface does not exist
return;
}
// stop preview before making changes
try {
mCamera.stopPreview();
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

11/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

} catch (Exception e){


// ignore: tried to stop a non-existent preview
}
// set preview size and make any resize, rotate or
// reformatting changes here
// start preview with new settings
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e){
Log.d(TAG, "Error starting camera preview: " +
e.getMessage());
}
}
}

Se voc quiser ajustar um tamanho especfico para a pr-visualizao da cmera,


configure isso no mtodo surfaceChanged() como observado no comentrio
acima. Quando ajustar o tamanho da pr-visualizao, voc precisa usar os
valores de getSupportedPreviewSizes(). No ajuste o tamanho para valores
arbitrrios no mtodo setPreviewSize().

Colocando a pr-visualizao no layout


Uma classe de pr-visualizao de cmera, como no exemplo mostrado acima,
precisa ser colocada no layout de uma Activity com outros controles para
usurio tirar fotos e vdeos. Essa seo mostra como voc pode criar um layout
bsico para a pr-visualizao.
O cdigo abaixo fornece um view bsico que pode ser usado para exibir a prvisualizao da cmera Nesse exemplo, p elemento FrameLayout
o continer para a classe da pr-visualizao da cmera. Esse tipo de layout
usado de forma que imagens adicionais ou controles possam ser sobrepostos
sobre a imagem da pr-visualizao.

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<FrameLayout
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

12/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

android:id="@+id/camera_preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
/>
<Button
android:id="@+id/button_capture"
android:text="Capture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
</LinearLayout>

Em muitos dispositivos, a orientao padro da pr-visualizao da cmera a


Paisagem. Esse exemplo de layout especifica um layout horizontal e o cdigo
abaixo corrige a orientao da aplicao para Paisagem. Para simplificar a
renderizao da pr-visualizao da cmera, voc deve alterar a orientao da
Activity de sua aplicao pela adico do seguinte cdigo ao seu manifesto.

<activity android:name=".CameraActivity"
android:label="@string/app_name"
android:screenOrientation="landscape">
<!-- configure this activity to use landscape orientation -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

Nota: Uma pr-visualizao no tem que estar no modo Paisagem. Desde o


Android 2.2 (API Livel 8), voc pode usar o mtodo setDisplayOrientation() para
ajustar a rotao da imagem de pr-visualizao. De forma a alterar a orientao
da pr-visualizao quando o usurio re-orienta o telefone, dentro do
mtodo surfaceChanged() de sua classe de pr-visualizao, primeiro interrompa
a pr-visualizao com Camera.stopPreview() mude a orientao e em seguida
inicie a pr-visualizao com Camera.startPreview().
Na Activity de sua pr-visualizao de cmera, adicione sua classe de prvisualizao como o elemento FrameLayout mostrado no exemplo acima. Sua
Activity de cmera precisa tambm garantir que a cmera seja liberada quando
a ela seja pausada ou encerrada. O exemplo seguinte mostra como modificar a
Activity da cmera para anexar a classe de pr-visualizao mostrada na seo
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

13/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

anterior.

public class CameraActivity extends Activity {


private Camera mCamera;
private CameraPreview mPreview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Create an instance of Camera
mCamera = getCameraInstance();
// Create our Preview view and set it as the content of our
activity.
mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout)
findViewById(id.camera_preview);
preview.addView(mPreview);
}
}

Nota: O mtodo getCameraInstance() do exemplo acima refere-se ao mtodo do


exemplo da seo Acessando a cmera.

Capturando imagens
Uma vez que voc tenha criado uma classe de pr-visualizao e um layout para
exibi-la, voc est pronto para iniciar a captura de imagens em sua aplicao. No
cdigo de sua aplicao, voc precisa configurar ouvintes para os controles da
interface para responder s aes do usurio ao tirar uma foto.
De modo a recuperar uma imagem, use o mtodo Camera.takePicture(). Esse
mtodo usa trs parmetros qu recebem dados da cmera. Para que os dados
sejam recebidos em formato JPEG, voc precisa implementar a
interface Camera.PictureCallback para receber os dados da imagem e receber
esses dados em um arquivo. O cdigo a seguir mostra uma implementao bsica
da interface Camera.PictureCallback para salvar uma imagem recebida da
cmera.

private PictureCallback mPicture = new PictureCallback() {

http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

14/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

@Override
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (pictureFile == null){
Log.d(TAG, "Error creating media file, check storage
permissions: " +
e.getMessage());
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.d(TAG, "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d(TAG, "Error accessing file: " + e.getMessage());
}
}
};

Dispare a captura de uma imagem pela chamada do


mtodo Camera.takePicture(). O cdigo fonte a seguir mostra como chamar esse
mtodo a partir de um boto View.OnClickListener.

// Add a listener to the Capture button


Button captureButton = (Button) findViewById(id.button_capture);
captureButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
// get an image from the camera
mCamera.takePicture(null, null, mPicture);
}
}
);

Nota: O membro mPicture do exemplo refere-se ao cdigo mostrado acima.


Cuidado: Lembre de liberar o objeto Camera pela chamada
a Camera.release() quando a sua aplicao tiver terminado de usar a cmera.

Capturando vdeos
Captura de vdeos usando o framework do Android necessita de um
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

15/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

gerenciamento cuidadoso do objeto Camera e coordenao com a


classe MediaRecorder. Quando estiver gravando um vdeo com Camera, voc
precisa gerenciar as chamadas a Camera.lock() e Camera.unlock() para permitir o
acesso a MediaRecorder ao hardware da cmera, em adio s chamada
a Camera.open() e Camera.release().
Nota: A partir do Android 4.0 (API Level 14), as chamadas
Camera.lock() e Camera.unlock() so gerenciadas automaticamente.
Ao contrrio da captura de fotos com a cmera do dispositivo, a captura de
vdeos requer uma ordem de chamada de mtodos muito particular. Voc
precisa seguir uma ordem de execuo especfica para preparar com sucesso e
capturar um vdeo pela sua aplicao, como descrito a seguir.
1. Abrir a cmera Use o mtodo Camera.open() para obter uma instncia do
objeto cmera.
2. Conectar a Pr-visualizao Preparar uma imagem ao vivo da cmera pela
conexo de um SurfaceView cmera usando Camera.setPreviewDisplay().
3. Iniciar a Pr-visualizao - Chamar Camera.startPreview() para iniciar a
exibio da pr-visualizao da cmera.
4. Iniciar a gravao do vdeo Os seguintes passos precisam ser executados de
forma que o vdeo seja gravado com sucesso:
1. Desbloquear a cmera Desbloqueie a cmera para uso
pelo MediaRecorder atravs da chamada Camera.unlock().
2. Configurar o MediaRecorder Chame os seguintes mtodos
de MediaRecorder nessa ordem. Para mais informaes, veja a
documentao deMediaRecorder.
1. setCamera() Configura a cmera a ser usada para a captura de vdeo,
use a instncia atual de Camera da sua aplicao.
2. setAudioSource() Configure a fonte do udio,
use MediaRecorder.AudioSource.CAMCORDER.
3. setVideoSource() Configure a fonte do vdeo,
use MediaRecorder.VideoSource.CAMERA.
4. Configure a codificao da sada de vdeo. Para o Android 2.2 (API Level
8) ou superior, use o mtodo MediaRecorder.setProfile, e obtenha uma
instncia do perfil usando CamcorderProfile.get(). Para verses do
Android anteriores a 2.2, voc precisa configurar o formato de sada do
vdeo e parmetros de codificao:
1. setOutputFormat() Configura o formato da sada, especificando a
configurao padro ou MediaRecorder.OutputFormat.MPEG_4.
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

16/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

2. setAudioEncoder() Configura o tipo de codificao do udio,


especificando a configurao padro
ou MediaRecorder.AudioEncoder.AMR_NB.
3. setVideoEncoder() Configura o tipo de codificao do vdeo,
especificando a configurao padro
ou MediaRecorder.VideoEncoder.MPEG_4_SP.
5. setOutputFile() Configura o arquivo de sada, use o
mtodo getOutputMediaFile(MEDIA_TYPE_VIDEO).toString() do exemplo da
seo Salvando arquivos de mdia.
6. setPreviewDisplay() Especifica o elemento do layout associado
ao SurfaceView para sua aplicao. Use o nome que voc especificou para
o Connect Preview.
3. Preparar o MediaRecorder Prepara o MediaRecorder com as
configuraes fornecidas atravs da chamada a MediaRecorder.prepare().
4. Iniciar o MediaRecorder Inicia a gravao do vdeo atravs da chamada
a MediaRecorder.start().
5. Interromper a gravao do vdeo Chame os seguintes mtodos nessa
ordem, para completar com sucesso uma gravao de vdeo:
1. Interromper o MediaRecorder Interrompa a gravao do vdeo pela
chamada a MediaRecorder.stop().
2. Reiniciar o MediaRecorder Opcionalmente, remova as configuraes
pela chamada a MediaRecorder.reset().
3. Liberar o MediaRecorder Libere o MediaRecorder atravs da chamada
a MediaRecorder.release().
4. Bloquear a cmera Trave a cmera de forma que sesses futuras
do MediaRecorder possam usa-lo atravs da chamada a Camera.lock(). A
partir do Android 4.0 (API level 14), essa chamada no necessria a
menos que MediaRecorder.prepare() falhe.
6. Interromper a pr-visualizao Quando a sua Activity tiver terminado de
usar a cmera, interrompa a pr-visualizao usando Camera.stopPreview().
7. Liberar a cmera Libere a cmera de forma que outras aplicaes possam
usa-la atravs da chamada a Camera.release().
Nota: possvel usar o MediaRecorder sem criar primeiro uma pr-visualizao
da cmera e pular os primeiros passos desse processo. Porm, como os usurios
preferem ver uma prvia antes de comear a gravao, esse processo no
discutido aqui.
Dica: Se sua aplicao for usada tipicamente para gravao,
ajuste setRecordingHint(boolean) para true antes de iniciar a pr-visualizao.
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

17/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

Essa ajuste pode reduzir o tempo de incio da gravao.

Configurando o MediaRecorder
Quando estiver usando a classe MediaRecorder para gravar vdeo, voc precisa
executar os passos da configurao em uma ordem especfica e depois chamar o
mtodo MediaRecorder.prepare() para verificar e implementar a configurao. O
exemplo de cdigo a seguir demonstra como configurar e preparar de forma
adequada a classe MediaRecorder para gravao de vdeo.

private boolean prepareVideoRecorder(){


mCamera = getCameraInstance();
mMediaRecorder = new MediaRecorder();
// Step 1: Unlock and set camera to MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
// Step 2: Set sources
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HI
GH));
// Step 4: Set output file
mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString
());
// Step 5: Set the preview output
mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
// Step 6: Prepare configured MediaRecorder
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
Log.d(TAG, "IllegalStateException preparing MediaRecorder: " +
e.getMessage());
releaseMediaRecorder();
return false;
} catch (IOException e) {
Log.d(TAG, "IOException preparing MediaRecorder: " +
e.getMessage());
releaseMediaRecorder();
return false;
}
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

18/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

return true;
}

Os parmetros de gravao de vdeo a seguir recebem valores padro, porm,


voc pode desejar ajusta-los m sua aplicao:
setVideoEncodingBitRate()
setVideoSize()
setVideoFrameRate()
setAudioEncodingBitRate()
setAudioChannels()
setAudioSamplingRate()

Iniciando e interrompendo o MediaRecorder


Quando se inicia e interrompe a gravao de vdeo usando a
classe MediaRecorder, voc precisa seguir uma ordem especifica, como listada
abaixo.
1. Desbloquear a cmera com Camera.unlock()
2. Configurar o MediaRecorder como mostrado no cdigo acima.
3. Iniciar a gravao usando MediaRecorder.start()
4. Gravar o vdeo.
5. Interromper a gravao pelo uso de MediaRecorder.stop()
6. Libere o MediaRecorder com MediaRecorder.release()
7. Bloqueie a cmera usando Camera.lock()
O cdigo a seguir demonstra como usar um boto para iniciar e interromper a
gravao de vdeo usando a cmera e a classe MediaRecorder.
Nota: Quando a gravao do vdeo terminada, no libere a cmera ou a prvisualizao ser interrompida.

private boolean isRecording = false;


// Add a listener to the Capture button
Button captureButton = (Button) findViewById(id.button_capture);
captureButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isRecording) {
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

19/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

// stop recording and release camera


mMediaRecorder.stop(); // stop the recording
releaseMediaRecorder(); // release the MediaRecorder
object
mCamera.lock();

// take camera access back from

MediaRecorder
// inform the user that recording has stopped
setCaptureButtonText("Capture");
isRecording = false;
} else {
// initialize video camera
if (prepareVideoRecorder()) {
// Camera is available and unlocked, MediaRecorder is
prepared,
// now you can start recording
mMediaRecorder.start();
// inform the user that recording has started
setCaptureButtonText("Stop");
isRecording = true;
} else {
// prepare didn't work, release the camera
releaseMediaRecorder();
// inform user
}
}
}
}
);

Nota: No exemplo acima, o mtodo prepareVideoRecorder() refere-se ao cdigo


mostrado na seo Configurando o MediaRecorder. Esse mtodo cuida do
bloqueio da cmera, configurao e preparao a instncia do MediaRecorder.

Liberando a cmera
Cmeras so recursos que so compartilhados por vrias aplicaes instaladas
no dispositivo. Sua aplicao pode fazer uso da cmera aps obter uma instncia
de Camera, e voc precisa ser particularmente cuidadoso quando a sua aplicao
termina de usa-la, e assim que a aplicao seja pausada (Activity.onPause()). Se
a sua aplicao no liberar de forma adequada a cmera, todas a tentativas de
acesso subsequentes a cmera, incluindo aquelas vindas de sua prpria
aplicao, iro falhar e podem causar o enceramento da aplicao.
Para liberar uma instncia do objeto Camera, use o mtodo Camera.release(),
como mostrado no exemplo a seguir.
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

20/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

public class CameraActivity extends Activity {


private Camera mCamera;
private SurfaceView mPreview;
private MediaRecorder mMediaRecorder;
...
@Override
protected void onPause() {
super.onPause();
releaseMediaRecorder();
release it first
releaseCamera();
pause event
}

// if you are using MediaRecorder,


// release the camera immediately on

private void releaseMediaRecorder(){


if (mMediaRecorder != null) {
mMediaRecorder.reset();
// clear recorder configuration
mMediaRecorder.release(); // release the recorder object
mMediaRecorder = null;
mCamera.lock();
// lock camera for later use
}
}
private void releaseCamera(){
if (mCamera != null){
mCamera.release();
applications
mCamera = null;
}
}
}

// release the camera for other

Salvando os arquivos
Arquivos de mdia criados pelos usurios como fotos e vdeos devem ser salvos
em um diretrio do armazenamento externo do dispositivo (Carto SD) para
preservar o espao do sistema e permitir que os usurios possam acessar esses
arquivos sem o dispositivo. Existem muitos diretrios em que os arquivos podem
ser armazenados, porm existem apenas dois locais padro que voc deveria
considerar:
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURE
S) Esse mtodo retorna o local padro, compartilhado e recomendado para
salvar fotos e vdeos. Esse diretrio pblico, de forma que outras aplicaes
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

21/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

podem facilmente descobrir, ler, alterar e apagar os arquivos salvados dentro


dele. Se a sua aplicao for desinstalada pelo usurio, os arquivos de mdia
salvos nesse local no sero removidos. Para evitar interferncia com as
imagens e vdeos existentes, voc deve criar um sub-diretrio para os
arquivos de mdia de sua aplicao, como mostrado no cdigo abaixo. Esse
mtodo est disponvel no Android 2.2 (API Level 8).
Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) Esse mtodo
retorna um local padro para salvar fotos e vdeos que estejam associados a
sua aplicao. Se a sua aplicao for desinstalada, qualquer arquivo salvo
nesse local ser removido. A segurana no reforada para arquivos nesse
diretrio, de forma que outras aplicaes podem ler, alterar e apagar os
arquivos.
O exemplo de cdigo a seguir demonstra como criar um File ou Uri para um
arquivo de mdia que pode ser usado quando se invoca a cmera do dispositivo
com um Intent ou como parte da Criao de uma aplicao de cmera.

public static final int MEDIA_TYPE_IMAGE = 1;


public static final int MEDIA_TYPE_VIDEO = 2;
/** Create a file Uri for saving an image or video */
private static Uri getOutputMediaFileUri(int type){
return Uri.fromFile(getOutputMediaFile(type));
}
/** Create a File for saving an image or video */
private static File getOutputMediaFile(int type){
// To be safe, you should check that the SDCard is mounted
// using Environment.getExternalStorageState() before doing this.
File mediaStorageDir = new
File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyCameraApp");
// This location works best if you want the created images to be
shared
// between applications and persist after your app has been
uninstalled.
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new
Date());
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

22/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

File mediaFile;
if (type == MEDIA_TYPE_IMAGE){
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_"+ timeStamp + ".jpg");
} else if(type == MEDIA_TYPE_VIDEO) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"VID_"+ timeStamp + ".mp4");
} else {
return null;
}
return mediaFile;
}

Nota: Environment.getExternalStoragePublicDirectory() est disponvel no


Android 2.2 (API Level 8) ou superior. Se seu objetivo for dispositivos com
verses mais antigas do Android,
use Environment.getExternalStorageDirectory() ao invs disso.

Recursos de cmera
O Android suporta uma gama ampla de recursos de cmera que voc pode
controlar com a sua aplicao, como formato da imagem, modo de flash, ajustes
de foco, e muito mais. Essa seo lista os recursos de cmera comuns, e discute
brevemente como usar cada um. Muitos dos recursos de cmera podem ser
acessados e configurados atravs do objeto Camera.Parameters. Porm, existem
diversos recursos importantes que necessitam do que ajustes simples
no Camera.Parameters. Esses recursos so cobertos nas seguintes sees:
Medio e foco de certas reas
Deteco de rostos
Timelapse
Tabela 1. Recursos de cmera comuns ordenados pela Nvel de API do Android
onde eles foram introduzidos.
Recursos

API Level

Descrio

Face Detection

14

Identify human faces


within a picture and use
them for focus, metering
and white balance

http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

23/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

Metering Areas

14

Specify one or more


areas within an image
for calculating white
balance

Focus Areas

14

Set one or more areas


within an image to use
for focus

White Balance Lock

14

Stop or start automatic


white balance
adjustments

Exposure Lock

14

Stop or start automatic


exposure adjustments

Video Snapshot

14

Take a picture while


shooting video (frame
grab)

Time Lapse Video

11

Record frames with set


delays to record a time
lapse video

Multiple Cameras

Support for more than


one camera on a device,
including front-facing
and back-facing cameras

Focus Distance

Reports distances
between the camera and
objects that appear to be
in focus

Zoom

Set image magnification

Exposure Compensation

Increase or decrease the


light exposure level

GPS Data

Include or omit
geographic location data
with the image

White Balance

Set the white balance


mode, which affects
color values in the

http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

24/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

captured image
Focus Mode

Set how the camera


focuses on a subject such
as automatic, fixed,
macro or infinity

Scene Mode

Apply a preset mode for


specific types of
photography situations
such as night, beach,
snow or candlelight
scenes

JPEG Quality

Set the compression


level for a JPEG image,
which increases or
decreases image output
file quality and size

Flash Mode

Turn flash on, off, or use


automatic setting

Color Effects

Apply a color effect to


the captured image such
as black and white, sepia
tone or negative.

Anti-Banding

Reduces the effect of


banding in color
gradients due to JPEG
compression

Picture Format

Specify the file format


for the picture

Picture Size

Specify the pixel


dimensions of the saved
picture

Verificando a disponibilidade do recurso


A primeira coisa a se entender quando estiver configurando o uso de recursos de
cmera em dispositivos Android que nem todos os recursos so suportados em
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

25/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

todos os dispositivos. Alm disso, os dispositivos que suportem um recurso em


particular podem suportar esse recurso em nveis diferentes ou com opes
diferentes. Por esse motivo, parte do processo de deciso do desenvolvedor de
uma aplicao de cmera decidir quais recursos de cmera sero suportados e
em que nvel. Aps tomar essas decises, voc deve planejar incluir cdigo em
sua aplicao para verificar se o hardware do dispositivo suporta esses recursos
e evitar ser executado caso o recurso no esteja disponvel.
Voc pode verificar a disponibilidade de recursos de cmera pela obteno de
uma instncia do objeto de parmetros da cmera, e checando os mtodos
relevantes. O cdigo a seguir mostra como obter acesso a um
objeto Camera.Parameters e verificar se a cmera suporta o recurso de auto-foco:

// get Camera parameters


Camera.Parameters params = mCamera.getParameters();
List<String> focusModes = params.getSupportedFocusModes();
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
// Autofocus mode is supported
}

Voc pode usar a tcnica mostrada acima para outros recursos de cmera. O
objeto Camera.Parameters fornece um mtodo getSupported...
(), is...Supported() ou getMax...() para determinar se (e em que nvel) um
recurso suportado.
Se a sua aplicao precisar de um determinado recurso de cmera para
funcionar corretamente, voc pode requerer esses recursos atravs do
manifesto. Quando voc declara o uso de recursos especficos da cmera, como
flash ou auto-foco, o Google Play restringe a instalao de sua aplicao em
dispositivos que no suportem esses recursos. Para obter uma lista de recursos
que podem ser declarados no seu manifesto, veja Features Reference.

Usando os recursos da cmera


Muitos recursos de cmera so ativados usando um objeto Camera.Parameters.
Voc obtm esses objeto criando uma instncia do objeto Camera, chamando o
mtodo getParameters(), alterando o parmetro retornado e ento configurando
de volta para o objeto da cmera, como demonstrado no cdigo a seguir:

http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

26/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

// get Camera parameters


Camera.Parameters params = mCamera.getParameters();
// set the focus mode
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
// set Camera parameters
mCamera.setParameters(params);

Essa tcnica funciona para quase todos os recursos de cmera, e muitos


parmetros podem ser alterado a qualquer tempo aps a obteno de uma
instncia do objeto Camera. Alteraes nos parmetros so
tipicamente visveis aos usurios imediatamente pela pr-visualizao da
cmera. Do lado do software, alteraes nos parmetros podem levar vrios
quadros da imagem para surtirem efeito e o hardware da cmera processe as
novas instrues e atualize os dados da imagem.
Outros recursos de cmera necessitam de mais cdigo para serem
implementados, incluindo:
Medio e foco de certas reas
Deteco de rostos
Timelapse

Medio e focando de certas reas


In some photographic scenarios, automatic focusing and light metering may not
produce the desired results. Starting with Android 4.0 (API Level 14), your
camera application can provide additional controls to allow your app or users to
specify areas in an image to use for determining focus or light level settings and
pass these values to the camera hardware for use in capturing images or video.
Areas for metering and focus work very similarly to other camera features, in
that you control them through methods in the Camera.Parameters object. The
following code demonstrates setting two light metering areas for an instance
of Camera:

// Create an instance of Camera


mCamera = getCameraInstance();
// set Camera parameters
Camera.Parameters params = mCamera.getParameters();
if (params.getMaxNumMeteringAreas() > 0){ // check that metering areas are
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

27/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

supported
List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();
Rect areaRect1 = new Rect(-100, -100, 100, 100);
// specify an
in center of image
meteringAreas.add(new Camera.Area(areaRect1, 600)); // set weight
60%
Rect areaRect2 = new Rect(800, -1000, 1000, -800); // specify an
in upper right of image
meteringAreas.add(new Camera.Area(areaRect2, 400)); // set weight
40%
params.setMeteringAreas(meteringAreas);
}

area
to
area
to

mCamera.setParameters(params);

The Camera.Area object contains two data parameters: A Rect object for specifying
an area within the cameras field of view and a weight value, which tells the
camera what level of importance this area should be given in light metering or
focus calculations.
The Rect field in a Camera.Area object describes a rectangular shape mapped on a
2000 x 2000 unit grid. The coordinates -1000, -1000 represent the top, left corner
of the camera image, and coordinates 1000, 1000 represent the bottom, right
corner of the camera image, as shown in the illustration below.

Figure1.TheredlinesillustratethecoordinatesystemforspecifyingaCamera.Area
withinacamerapreview.Theblueboxshowsthelocationandshapeofancameraarea
withtheRectvalues333,333,667,667.

The bounds of this coordinate system always correspond to the outer edge of the
image visible in the camera preview and do not shrink or expand with the zoom
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

28/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

level. Similarly, rotation of the image preview


usingCamera.setDisplayOrientation() does not remap the coordinate system.

Deteco de rostos
For pictures that include people, faces are usually the most important part of the
picture, and should be used for determining both focus and white balance when
capturing an image. The Android 4.0 (API Level 14) framework provides APIs for
identifying faces and calculating picture settings using face recognition
technology.
Nota: While the face detection feature is
running, setWhiteBalance(String), setFocusAreas(List)and setMeteringAreas(List
) have no effect.
Using the face detection feature in your camera application requires a few
general steps:
Check that face detection is supported on the device
Create a face detection listener
Add the face detection listener to your camera object
Start face detection after preview (and after every preview restart)
The face detection feature is not supported on all devices. You can check that this
feature is supported by calling getMaxNumDetectedFaces(). An example of this
check is shown in the startFaceDetection()sample method below.
In order to be notified and respond to the detection of a face, your camera
application must set a listener for face detection events. In order to do this, you
must create a listener class that implements
theCamera.FaceDetectionListener interface as shown in the example code below.

class MyFaceDetectionListener implements Camera.FaceDetectionListener {


@Override
public void onFaceDetection(Face[] faces, Camera camera) {
if (faces.length > 0){
Log.d("FaceDetection", "face detected: "+ faces.length +
" Face 1 Location X: " + faces[0].rect.centerX() +
"Y: " + faces[0].rect.centerY() );
}
}
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

29/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

After creating this class, you then set it into your applications Camera object, as
shown in the example code below:

mCamera.setFaceDetectionListener(new MyFaceDetectionListener());

Your application must start the face detection function each time you start (or
restart) the camera preview. Create a method for starting face detection so you
can call it as needed, as shown in the example code below.

public void startFaceDetection(){


// Try starting Face Detection
Camera.Parameters params = mCamera.getParameters();
// start face detection only *after* preview has started
if (params.getMaxNumDetectedFaces() > 0){
// camera supports face detection, so can start it:
mCamera.startFaceDetection();
}
}

You must start face detection each time you start (or restart) the camera preview.
If you use the preview class shown in Creating a preview class, add
your startFaceDetection() method to both
thesurfaceCreated() and surfaceChanged() methods in your preview class, as
shown in the sample code below.

public void surfaceCreated(SurfaceHolder holder) {


try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
startFaceDetection(); // start face detection feature
} catch (IOException e) {
Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
if (mHolder.getSurface() == null){
// preview surface does not exist
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

30/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

Log.d(TAG, "mHolder.getSurface() == null");


return;
}
try {
mCamera.stopPreview();
} catch (Exception e){
// ignore: tried to stop a non-existent preview
Log.d(TAG, "Error stopping camera preview: " + e.getMessage());
}
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
startFaceDetection(); // re-start face detection feature
} catch (Exception e){
// ignore: tried to stop a non-existent preview
Log.d(TAG, "Error starting camera preview: " + e.getMessage());
}
}

Nota: Remember to call this method after calling startPreview(). Do not attempt
to start face detection in the onCreate() method of your camera apps main
activity, as the preview is not available by this point in your applications the
execution.

Timelapse
Time lapse video allows users to create video clips that combine pictures taken a
few seconds or minutes apart. This feature uses MediaRecorder to record the
images for a time lapse sequence.
To record a time lapse video with MediaRecorder, you must configure the recorder
object as if you are recording a normal video, setting the captured frames per
second to a low number and using one of the time lapse quality settings, as
shown in the code example below.

// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)


mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_TI
ME_LAPSE_HIGH));
...
// Step 5.5: Set the video capture rate to a low number
mMediaRecorder.setCaptureRate(0.1); // capture a frame every 10 seconds
http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

31/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

These settings must be done as part of a larger configuration procedure


for MediaRecorder. For a full configuration code example, see Configuring
MediaRecorder. Once the configuration is complete, you start the video
recording as if you were recording a normal video clip. For more information
about configuring and running MediaRecorder, see Capturing videos.

Like

Tweet

Compartilhar

Related posts:
1. Opes de armazenamento no Android (Traduo da documentao
oficial) O Android fornece diversas opes para que voc salve dados persistentes da aplicao. A
soluo que voc escolher depende da...

2. Capturando stream HDV de uma camera Firewire no Linux Este artigo uma
traduo da pgina http://figvam.blogspot.com/2007/01/capturing-hdv-stream-from-camera-in.html, e
explica com capturar video HDV usando o Linux. Apesar de o...

3. Usando seu prprio banco de dados SQLite em aplicaes Android A maioria


dos exemplos e tutoriais de aplicaes Android por ai assumem que voc quer criar e preencher seu
banco...

4. Tcnicas de iluminao: Iluminao On-Camera Iluminao On-Camera somente o


que voc estiver observando para dar a uma tomada escura um apelo adicional ou um...

5. Utilizando os sensores do Android em sua aplicao para monitoramento


do ambiente externo A plataforma Android idela, especialmente por causa dos
desenvolvvedores Java, para criar aplicaes inovadoras que fazem uso de sensores...

23deagostode2012 KleberMota Android Android,camera,detecodefaces,foco,


mediarecorder,medio,surfaceview,timelapse

http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

32/33

23/12/2014

UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

1Comentrio

BlogKleberMota

Entrar

Compartilhar Favorito

OrdenarporMaisrecente

Participedadiscusso...
WellingtonLopes 13daysago

OlKleber,estoutentandoimplementaremminhaaplicao,acamerasem
visualizaodaimagem,ouseja,aopressionarumboto,sertiradoafoto
semqueousurioperceba.Estouusandoocordova,edproblemasaousaro
PictureCallbackpoisnoencontraessaclasse,temalgumaideiaparaeste
fato?

Responder Compartilhar

OQUEISSO?

TAMBMEMBLOGKLEBERMOTA

TutorialdeCanvasParte3
Usandoimagens

Comogravarudiodealta
qualidadeparafilmes

2comentrios8monthsago

2comentrios8monthsago

GuestOlkleber,excelentepost,

KleberMotaRonaldo,vocpode

tenhoumadvida:consigogeraro
data:URL,copioeatravsdeum
gerenciadordemysqlgravoemum

conectaromicrofonediretamenteao
gravadorzoomsemproblema,
tomandoocuidadodefazermarcaes

Orgulhosamente desenvolvido com WordPress

http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/

33/33

Você também pode gostar