33
23/12/2014 Usando a câmera no Android (Tradução da documentação oficial) | klebermota.eti.br http://www.klebermota.eti.br/2012/08/23/usandoacameranoandroidtraducaodadocumentacaooficial/ 1/33 Usando a câmera no Android (Tradução da documentação oficial) O framework do Android inclui suporte para várias câmeras e recursos de câmera disponíveis em dispositivos diversos, permitindo que você capture imagens e vídeos em suas aplicações. Esse artigo irá mostra de forma rápida e simples como capturar imagens e vídeos e mostrará uma abordagem avançada para criar experiências personalizadas utilizando a câmera aos usuários de seu aplicativo. Considerações Antes de permitir que sua aplicação use a câmera do dispositivo Android, você deve considerar algumas poucas questões sobre como seu aplicativo pretende usar esse recurso de hardware. Obrigatoriedade da Câmera – O uso da câmera é importante o bastante para sua aplicação de forma que você não queira permitir que ela seja instalada em dispositivos que não possuam câmera? Em caso positivo, você deve declarar a obrigatoriedade da câmera em seu manifesto. Imagem rápida ou câmera personalizada – Como a sua aplicação usará a câmera? Você está interessado apenas em obter uma imagem ou vídeo de forma rápida ou sua aplicação fornecerá uma nova forma de usar a câmera? Para obter uma imagem ou vídeo de forma rápida, considere os OFERTA RELÂMPAGO DELL Inspiron 14 Série 3000 com HD500, Frete Grátis e Intel® Core. Veja!

Usando a Câmera No Android (Tradução Da Documentação Oficial) _ Klebermota.eti

Embed Size (px)

DESCRIPTION

bvgvgv

Citation preview

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    Usando a cmera no Android (Traduo dadocumentao oficial)

    O framework do Android inclui suporte para vrias cmeras e recursos decmera disponveis em dispositivos diversos, permitindo que voc captureimagens e vdeos em suas aplicaes. Esse artigo ir mostra de forma rpida esimples como capturar imagens e vdeos e mostrar uma abordagem avanadapara criar experincias personalizadas utilizando a cmera aos usurios de seuaplicativo.

    Consideraes

    Antes de permitir que sua aplicao use a cmera do dispositivo Android, vocdeve considerar algumas poucas questes sobre como seu aplicativo pretendeusar esse recurso de hardware.

    Obrigatoriedade da Cmera O uso da cmera importante o bastante parasua aplicao de forma que voc no queira permitir que ela seja instaladaem dispositivos que no possuam cmera? Em caso positivo, voc devedeclarar a obrigatoriedade da cmera em seu manifesto.Imagem rpida ou cmera personalizada Como a sua aplicao usar acmera? Voc est interessado apenas em obter uma imagem ou vdeo deforma rpida ou sua aplicao fornecer uma nova forma de usar a cmera?Para obter uma imagem ou vdeo de forma rpida, considere os

    O F E R T A R E L M P A G O D E L L Inspiron 14 Srie 3000 com HD500, Frete Grtis e Intel Core. Veja!

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    procedimentos descritos na seo Usando aplicativos existentes de cmera.Para desenvolver um recurso personalizado, cheque a seo Criando umaplicativo de cmera.Armazenamento As imagens e vdeos geradas pela sua aplicao devemestar disponveis apenas para ela ou devem ser compartilhadas como outrosaplicativos, como o Gallery ou outro tipo de aplicativo? Voc quer que asimagens e vdeos permaneam disponveis mesmo aps a remoo doaplicativo? Veja a seo Salvando os arquivos para ver como implementaressas opes.

    O bsico

    O framework do Android suporta a captura de imagens e vdeos atravs daAPI 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 decmera.

    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 dotipo MediaStore.ACTION_IMAGE_CAPTURE ou MediaStore.ACTION_VIDEO_CAPTURE podeser usado para capturar imagens e vdeos sem usar diretamente o objeto Camera.

    Declaraes no Manifesto

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    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 declaraesnecessrias para permitir o uso do hardware da cmera e outros recursosrelacionados.

    Permisses da Cmera Sua aplicao precisa requerer permisso parausar a cmera do dispositivo.

    Nota: Se voc estiver usando a cmera via intent, no precisa dessa permisso.

    Recursos da Cmera Sua aplicao precisa declarar o uso do recursos dacmera, por exemplo:

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

    Adicionar recursos de cmera ao seu manifesto faz com que o Google Playevite que sua aplicao seja instalada em dispositivos que no suportem osrecursos de cmera que voc especificar. Para mais informaes sobre o filtrobaseado nos recursos utilizados do Google Play, veja Google Play and Feature-Based Filtering.

    Se a sua aplicao puder usar uma cmera ou um recurso da cmera paraoperar de forma adequada, mas no necessitar desse recurso voc deveespecificar isso no manifesto pela incluso do atributo android:required e oajuste dele para o valor false:

    Permisses para armazenamento Se a sua aplicao salva as imagens evdeos no armazenamento externo (Carto SD), voc deve especificar isso nomanifesto.

    Permisses para gravao de udio Para gravar udio junto com o vdeo

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

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

    Permisso para Geolocalizao Se sua aplicao anexa a geolocalizao daimagem junto com ela, precisa requisitar permisso para geolocalizao:

    Usando Aplicativos de Cmera existentes

    Uma forma rpida para permitir que a sua aplicao tirar fotos ou vdeos sem terque criar muito cdigo extra usar um Intent para invocar uma aplicao decmera existente do Android. Um intent de cmera faz uma requisio paracapturar uma imagem ou clip de vdeo atravs de uma aplicao de cmeraexistente e em seguida retorna para a aplicao. Essa seo mostra comocapturar 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 ouvdeo, usando um desses tipos de intent:

    MediaStore.ACTION_IMAGE_CAPTURE tipo para requisitar uma imagem apartir de uma aplicao de cmera existente.MediaStore.ACTION_VIDEO_CAPTURE tipo para requisitar um vdeo a partir deuma aplicao de cmera existente.

    2. Iniciar o Intent da cmera Use o mtodo startActivityForResult() paraexecutar o intent da cmera. Aps iniciar o intent, a interface da Cmeraaparece na tela do dispositivo e o usurio pode tirar uma foto ou vdeo.

    3. Recepcionar o Resultado da Intent Configure ummtodo onActivityResult() em sua aplicao para receber a resposta e osdados 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

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    Capturar imagens usando um intent de cmera a forma mais rpida depermitir que sua aplicao tire fotos com o mnimo de codificao. Um intent decaptura de imagens pode incluir as seguintes informaes extras:

    MediaStore.EXTRA_OUTPUT Esse ajuste necessita de um objeto Uri queespecifica um caminho e um nome de arquivo onde voc gostaria de salvar aimagem. Essa configurao opcional mas fortemente recomendada. Se vocno precisar especificar esse valor, a aplicao da cmera salva a imagemrequisitada no local padro com um nome padro, especificado nocampo Intent.getData() dointent.

    O exemplo seguinte demonstra como criar um intent de captura de imagem eexecut-lo. O mtodo getOutputMediaFileUri() desse exemplo refere-se ao cdigofonte exemplo mostrado em Salvando arquivos de mdia.

    private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;private Uri fileUri;

    @Overridepublic 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 ainterface da cmera. Depois que o usurio termina de tirar a foto (ou cancela aoperao), a interface retorna para sua aplicao, e voc precisa interceptar omtodo onActivityResult() para receber o resultado do intent e continuar aexecuo de sua aplicao. Para informaes de como receber ointent completado, veja Receiving camera intent result.

    Intent de captura de vdeo

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    Capturar vdeo usando um intent de cmera a forma mais rpida de permitirque a sua aplicao tire vdeos com a mnima quantidade de cdigo. Um intent decaptura de vdeo pode incluir as seguintes informaes extras:

    MediaStore.EXTRA_OUTPUT Essa configurao necessita de um Uri queespecifica um caminho e um nome de arquivo onde voc gostaria de salvar ovdeo. Essa configurao opcional mas fortemente recomendada. Se vocno especificar esse valor, a aplicao da Cmera salva o vdeo requisitado nolocal padro com um nona padro especificado no campo Intent.getData() dointent.MediaStore.EXTRA_VIDEO_QUALITY Esse valor pode ser ser 0 para a menorqualidade e arquivos menores ou 1 para para a melhor qualidade e arquivomaiores.MediaStore.EXTRA_DURATION_LIMIT Configure esse valor para o limite detamanho, em segundos, do vdeo a ser capturado.MediaStore.EXTRA_SIZE_LIMIT Configure esse valor para o limite, em bytes, doarquivo a ser capturado.

    O exemplo a seguir demonstra como criar um intent de captura de vdeo eexecuta-lo. O mtodo getOutputMediaFileUri() nesse exemplo refere-se ao cdigofonte exemplo mostrada em Saving Media Files.

    private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;private Uri fileUri;

    @Overridepublic 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); // create a file to save the video intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name

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

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    Quando o mtodo startActivityForResult() executado, os usurios vero ainterface da aplicao de cmera. Depois que o usurio termina de gravar ovdeo (ou cancela a operao), a interface retorna para para sua aplicao, e vocprecisa interceptar o mtodo onActivityResult() para receber o resultado dointent e continuar a execuo de sua aplicao. Para obter informaes de comofazer 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. Essaseo descreve como interceptar o resultado de um intent da cmerade formaque sua aplicao possa executar o processamento dessa imagem ou vdeocapturado.

    De forma a receber o resultado de um intent, voc precisa sobrecarregar omtodo onActivityResult() na Activity que iniciou o intent. O exemplo a seguirdemonstra como sobrecarregar esse mtodo para capturar o resultado dosexemplos 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;

    @Overrideprotected 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 {

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    // Video capture failed, advise user } }}

    Uma vez que a sua Activity receba o resultado com sucesso, a imagem ou vdeocapturado 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 sejapersonalizada a aparncia de suas aplicaes ou fornea recursos especiais. Criarum Activity de cmera personalizada necessita de mais cdigo do que o uso deum intent, mas pode fornecer uma experincia melhor ao usurio.

    Os passos gerais para criar uma interface personalizada da cmera para suaaplicao so os seguintes:

    Detectar e acessar a cmera Criar o cdigo para verificar a existncia decmeras e solicitar acesso.Criar uma classe de pr-visualizao Criar um classe de pr-visualizaoque estenda SurfaceView e implemente a interface SurfaceHolder. Essa classevisualiza imagens ao vivo da cmera.Criar o layout da pr-visualizao Uma vez que voc tenha a classe de pr-visualizao, crie um layout que incorpore a pr-visualizao e os controlesque voc deseja.Ajustar os ouvintes para a captura Conecte os ouvintes para que oscontroles de sua interface possam iniciar a captura da imagem ou vdeo emresposta a alguma ao, como pressionar um boto.Capturar e salvar aqquivos Configure o cdigo para capturar images evdeos e salvar a sada.Liberar a cmera Depois de usar a cmera, sua aplicao precisa libera-laadequadamente para que outras aplicaes possam usa-la.

    O hardware da cmera um recurso compartilhado que precisa ser gerenciadocuidadosamente de forma que a sua aplicao no colida com outras aplicaesque tambm queiram usa-lo. As sees a seguir discutem como detectar ohardware da cmera, como solicitar acesso a cmera, como capturar imagens evdeos e como liberar a cmera quando sua aplicao no estiver mais usando

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    ela.

    Cuidado: Lembre de liberar o objeto Camera pela chamada Camera.release() quando sua aplicao tiver finalizado o uso da cmera. Se suaaplicao no liberar a cmera adequadamente, todas as tentativas subsequentesde acesso a cmera, incluindo os da sua prpria aplicao, iro falhar e podemfazer 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_CAMERA)){ // 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 naparte de trs para fotografia e uma cmera frontal para videochamadas. OAndroid 2.3 (API Level 9) e superiores permitem que voc verifiquem o nmerode cmeras disponveis em um dispositivo usando omtodo Camera.getNumberOfCameras().

    Acessando a cmera

    Se voc determinar que o dispositivo onde sua aplicao est sendo executadapossui uma cmera, voc precisa solicitar acesso a ela pela obteno de umainstncia 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

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    klebermota.eti.brBlogsobrecincia,computaoeprojetosrelacionados

    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 checarpor excees quando a cmera estiver em uso ou no exista acarretar noencerramento de sua aplicao pelo sistema.

    Em dispositivos rodando o Android 2.3 (API Level 9) ou superior, voc podeacessar cmeras especificas usando Camera.open(int). O exemplo de cdigo acimair acessar a primeira cmera, na parte de trs, em um dispositivo com mais deuma cmera.

    Verificando os recursos da cmera

    Uma vez que voc tenha obtido a uma cmera, voc pode obter informaessobre os seus recursos usando o mtodo Camera.getParameters() e verificando oretorno do objeto Camera.Parameters por recursos suportados. Quando estiverusando a API Level 9 ou superior, use Camera.getCameraInfo() para determinar sea 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 seremcapazes 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 formaque os usurios possam enquadrar e capturar um imagem ou vdeo.

    O exemplo de cdigo a seguir demonstra como criar uma classe de pr-visualizao bsica que pode ser includa em um layout. Essa classeimplementa SurfaceHolder.Callback de forma a poder capturar eventos para a

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    criao e destruio do view, que necessrio para atribuir a entrada da pr-visualizao 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();

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    } 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 comentrioacima. Quando ajustar o tamanho da pr-visualizao, voc precisa usar osvalores de getSupportedPreviewSizes(). No ajuste o tamanho para valoresarbitrrios 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 parausurio tirar fotos e vdeos. Essa seo mostra como voc pode criar um layoutbsico para a pr-visualizao.

    O cdigo abaixo fornece um view bsico que pode ser usado para exibir a pr-visualizao 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 sobrepostossobre a imagem da pr-visualizao.

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    android:id="@+id/camera_preview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" />

    Em muitos dispositivos, a orientao padro da pr-visualizao da cmera aPaisagem. Esse exemplo de layout especifica um layout horizontal e o cdigoabaixo corrige a orientao da aplicao para Paisagem. Para simplificar arenderizao da pr-visualizao da cmera, voc deve alterar a orientao daActivity de sua aplicao pela adico do seguinte cdigo ao seu manifesto.

    Nota: Uma pr-visualizao no tem que estar no modo Paisagem. Desde oAndroid 2.2 (API Livel 8), voc pode usar o mtodo setDisplayOrientation() paraajustar a rotao da imagem de pr-visualizao. De forma a alterar a orientaoda pr-visualizao quando o usurio re-orienta o telefone, dentro domtodo surfaceChanged() de sua classe de pr-visualizao, primeiro interrompaa pr-visualizao com Camera.stopPreview() mude a orientao e em seguidainicie a pr-visualizao com Camera.startPreview().

    Na Activity de sua pr-visualizao de cmera, adicione sua classe de pr-visualizao como o elemento FrameLayout mostrado no exemplo acima. SuaActivity de cmera precisa tambm garantir que a cmera seja liberada quandoa ela seja pausada ou encerrada. O exemplo seguinte mostra como modificar aActivity da cmera para anexar a classe de pr-visualizao mostrada na seo

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    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 doexemplo da seo Acessando a cmera.

    Capturando imagens

    Uma vez que voc tenha criado uma classe de pr-visualizao e um layout paraexibi-la, voc est pronto para iniciar a captura de imagens em sua aplicao. Nocdigo de sua aplicao, voc precisa configurar ouvintes para os controles dainterface para responder s aes do usurio ao tirar uma foto.

    De modo a recuperar uma imagem, use o mtodo Camera.takePicture(). Essemtodo usa trs parmetros qu recebem dados da cmera. Para que os dadossejam recebidos em formato JPEG, voc precisa implementar ainterface Camera.PictureCallback para receber os dados da imagem e receberesses dados em um arquivo. O cdigo a seguir mostra uma implementao bsicada interface Camera.PictureCallback para salvar uma imagem recebida dacmera.

    private PictureCallback mPicture = new PictureCallback() {

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    @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 domtodo Camera.takePicture(). O cdigo fonte a seguir mostra como chamar essemtodo a partir de um boto View.OnClickListener.

    // Add a listener to the Capture buttonButton 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 chamadaa 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

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    gerenciamento cuidadoso do objeto Camera e coordenao com aclasse MediaRecorder. Quando estiver gravando um vdeo com Camera, vocprecisa gerenciar as chamadas a Camera.lock() e Camera.unlock() para permitir oacesso a MediaRecorder ao hardware da cmera, em adio s chamadaa 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 devdeos requer uma ordem de chamada de mtodos muito particular. Vocprecisa seguir uma ordem de execuo especfica para preparar com sucesso ecapturar um vdeo pela sua aplicao, como descrito a seguir.

    1. Abrir a cmera Use o mtodo Camera.open() para obter uma instncia doobjeto cmera.

    2. Conectar a Pr-visualizao Preparar uma imagem ao vivo da cmera pelaconexo de um SurfaceView cmera usando Camera.setPreviewDisplay().

    3. Iniciar a Pr-visualizao - Chamar Camera.startPreview() para iniciar aexibio da pr-visualizao da cmera.

    4. Iniciar a gravao do vdeo Os seguintes passos precisam ser executados deforma 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 adocumentao 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 umainstncia do perfil usando CamcorderProfile.get(). Para verses doAndroid anteriores a 2.2, voc precisa configurar o formato de sada dovdeo e parmetros de codificao:1. setOutputFormat() Configura o formato da sada, especificando a

    configurao padro ou MediaRecorder.OutputFormat.MPEG_4.

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    2. setAudioEncoder() Configura o tipo de codificao do udio,especificando a configurao padroou MediaRecorder.AudioEncoder.AMR_NB.

    3. setVideoEncoder() Configura o tipo de codificao do vdeo,especificando a configurao padroou MediaRecorder.VideoEncoder.MPEG_4_SP.

    5. setOutputFile() Configura o arquivo de sada, use omtodo getOutputMediaFile(MEDIA_TYPE_VIDEO).toString() do exemplo daseo Salvando arquivos de mdia.

    6. setPreviewDisplay() Especifica o elemento do layout associadoao SurfaceView para sua aplicao. Use o nome que voc especificou parao Connect Preview.

    3. Preparar o MediaRecorder Prepara o MediaRecorder com asconfiguraes fornecidas atravs da chamada a MediaRecorder.prepare().

    4. Iniciar o MediaRecorder Inicia a gravao do vdeo atravs da chamadaa MediaRecorder.start().

    5. Interromper a gravao do vdeo Chame os seguintes mtodos nessaordem, 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(). Apartir do Android 4.0 (API level 14), essa chamada no necessria amenos que MediaRecorder.prepare() falhe.

    6. Interromper a pr-visualizao Quando a sua Activity tiver terminado deusar a cmera, interrompa a pr-visualizao usando Camera.stopPreview().

    7. Liberar a cmera Libere a cmera de forma que outras aplicaes possamusa-la atravs da chamada a Camera.release().

    Nota: possvel usar o MediaRecorder sem criar primeiro uma pr-visualizaoda cmera e pular os primeiros passos desse processo. Porm, como os usuriospreferem 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.

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    Essa ajuste pode reduzir o tempo de incio da gravao.

    Configurando o MediaRecorder

    Quando estiver usando a classe MediaRecorder para gravar vdeo, voc precisaexecutar os passos da configurao em uma ordem especfica e depois chamar omtodo MediaRecorder.prepare() para verificar e implementar a configurao. Oexemplo de cdigo a seguir demonstra como configurar e preparar de formaadequada 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_HIGH));

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

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    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 aclasse MediaRecorder, voc precisa seguir uma ordem especifica, como listadaabaixo.

    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 agravao de vdeo usando a cmera e a classe MediaRecorder.

    Nota: Quando a gravao do vdeo terminada, no libere a cmera ou a pr-visualizao ser interrompida.

    private boolean isRecording = false;

    // Add a listener to the Capture buttonButton captureButton = (Button) findViewById(id.button_capture);captureButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { if (isRecording) {

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    // 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 cdigomostrado na seo Configurando o MediaRecorder. Esse mtodo cuida dobloqueio da cmera, configurao e preparao a instncia do MediaRecorder.

    Liberando a cmera

    Cmeras so recursos que so compartilhados por vrias aplicaes instaladasno dispositivo. Sua aplicao pode fazer uso da cmera aps obter uma instnciade Camera, e voc precisa ser particularmente cuidadoso quando a sua aplicaotermina de usa-la, e assim que a aplicao seja pausada (Activity.onPause()). Sea sua aplicao no liberar de forma adequada a cmera, todas a tentativas deacesso subsequentes a cmera, incluindo aquelas vindas de sua prpriaaplicao, 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.

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    public class CameraActivity extends Activity { private Camera mCamera; private SurfaceView mPreview; private MediaRecorder mMediaRecorder;

    ...

    @Override protected void onPause() { super.onPause(); releaseMediaRecorder(); // if you are using MediaRecorder, release it first releaseCamera(); // release the camera immediately on pause event }

    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(); // release the camera for other applications mCamera = null; } }}

    Salvando os arquivos

    Arquivos de mdia criados pelos usurios como fotos e vdeos devem ser salvosem um diretrio do armazenamento externo do dispositivo (Carto SD) parapreservar o espao do sistema e permitir que os usurios possam acessar essesarquivos sem o dispositivo. Existem muitos diretrios em que os arquivos podemser armazenados, porm existem apenas dois locais padro que voc deveriaconsiderar:

    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) Esse mtodo retorna o local padro, compartilhado e recomendado parasalvar fotos e vdeos. Esse diretrio pblico, de forma que outras aplicaes

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    podem facilmente descobrir, ler, alterar e apagar os arquivos salvados dentrodele. Se a sua aplicao for desinstalada pelo usurio, os arquivos de mdiasalvos nesse local no sero removidos. Para evitar interferncia com asimagens e vdeos existentes, voc deve criar um sub-diretrio para osarquivos de mdia de sua aplicao, como mostrado no cdigo abaixo. Essemtodo est disponvel no Android 2.2 (API Level 8).Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) Esse mtodoretorna um local padro para salvar fotos e vdeos que estejam associados asua aplicao. Se a sua aplicao for desinstalada, qualquer arquivo salvonesse local ser removido. A segurana no reforada para arquivos nessediretrio, de forma que outras aplicaes podem ler, alterar e apagar osarquivos.

    O exemplo de cdigo a seguir demonstra como criar um File ou Uri para umarquivo de mdia que pode ser usado quando se invoca a cmera do dispositivocom 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());

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    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 noAndroid 2.2 (API Level 8) ou superior. Se seu objetivo for dispositivos comverses 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 podecontrolar com a sua aplicao, como formato da imagem, modo de flash, ajustesde foco, e muito mais. Essa seo lista os recursos de cmera comuns, e discutebrevemente como usar cada um. Muitos dos recursos de cmera podem seracessados e configurados atravs do objeto Camera.Parameters. Porm, existemdiversos recursos importantes que necessitam do que ajustes simplesno Camera.Parameters. Esses recursos so cobertos nas seguintes sees:

    Medio e foco de certas reasDeteco de rostosTimelapse

    Tabela 1. Recursos de cmera comuns ordenados pela Nvel de API do Androidonde eles foram introduzidos.

    Recursos API Level Descrio

    Face Detection 14 Identify human faceswithin a picture and usethem for focus, meteringand white balance

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    Metering Areas 14 Specify one or moreareas within an imagefor calculating whitebalance

    Focus Areas 14 Set one or more areaswithin an image to usefor focus

    White Balance Lock 14 Stop or start automaticwhite balanceadjustments

    Exposure Lock 14 Stop or start automaticexposure adjustments

    Video Snapshot 14 Take a picture whileshooting video (framegrab)

    Time Lapse Video 11 Record frames with setdelays to record a timelapse video

    Multiple Cameras 9 Support for more thanone camera on a device,including front-facingand back-facing cameras

    Focus Distance 9 Reports distancesbetween the camera andobjects that appear to bein focus

    Zoom 8 Set image magnification

    Exposure Compensation 8 Increase or decrease thelight exposure level

    GPS Data 5 Include or omitgeographic location datawith the image

    White Balance 5 Set the white balancemode, which affectscolor values in the

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    captured image

    Focus Mode 5 Set how the camerafocuses on a subject suchas automatic, fixed,macro or infinity

    Scene Mode 5 Apply a preset mode forspecific types ofphotography situationssuch as night, beach,snow or candlelightscenes

    JPEG Quality 5 Set the compressionlevel for a JPEG image,which increases ordecreases image outputfile quality and size

    Flash Mode 5 Turn flash on, off, or useautomatic setting

    Color Effects 5 Apply a color effect tothe captured image suchas black and white, sepiatone or negative.

    Anti-Banding 5 Reduces the effect ofbanding in colorgradients due to JPEGcompression

    Picture Format 1 Specify the file formatfor the picture

    Picture Size 1 Specify the pixeldimensions of the savedpicture

    Verificando a disponibilidade do recurso

    A primeira coisa a se entender quando estiver configurando o uso de recursos decmera em dispositivos Android que nem todos os recursos so suportados em

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    todos os dispositivos. Alm disso, os dispositivos que suportem um recurso emparticular podem suportar esse recurso em nveis diferentes ou com opesdiferentes. Por esse motivo, parte do processo de deciso do desenvolvedor deuma aplicao de cmera decidir quais recursos de cmera sero suportados eem que nvel. Aps tomar essas decises, voc deve planejar incluir cdigo emsua aplicao para verificar se o hardware do dispositivo suporta esses recursose evitar ser executado caso o recurso no esteja disponvel.

    Voc pode verificar a disponibilidade de recursos de cmera pela obteno deuma instncia do objeto de parmetros da cmera, e checando os mtodosrelevantes. O cdigo a seguir mostra como obter acesso a umobjeto Camera.Parameters e verificar se a cmera suporta o recurso de auto-foco:

    // get Camera parametersCamera.Parameters params = mCamera.getParameters();

    List 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. Oobjeto Camera.Parameters fornece um mtodo getSupported...(), is...Supported() ou getMax...() para determinar se (e em que nvel) umrecurso suportado.

    Se a sua aplicao precisar de um determinado recurso de cmera parafuncionar corretamente, voc pode requerer esses recursos atravs domanifesto. Quando voc declara o uso de recursos especficos da cmera, comoflash ou auto-foco, o Google Play restringe a instalao de sua aplicao emdispositivos que no suportem esses recursos. Para obter uma lista de recursosque 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 omtodo getParameters(), alterando o parmetro retornado e ento configurandode volta para o objeto da cmera, como demonstrado no cdigo a seguir:

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    // get Camera parametersCamera.Parameters params = mCamera.getParameters();// set the focus modeparams.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);// set Camera parametersmCamera.setParameters(params);

    Essa tcnica funciona para quase todos os recursos de cmera, e muitosparmetros podem ser alterado a qualquer tempo aps a obteno de umainstncia do objeto Camera. Alteraes nos parmetros sotipicamente visveis aos usurios imediatamente pela pr-visualizao dacmera. Do lado do software, alteraes nos parmetros podem levar vriosquadros da imagem para surtirem efeito e o hardware da cmera processe asnovas instrues e atualize os dados da imagem.

    Outros recursos de cmera necessitam de mais cdigo para seremimplementados, incluindo:

    Medio e foco de certas reasDeteco de rostosTimelapse

    Medio e focando de certas reas

    In some photographic scenarios, automatic focusing and light metering may notproduce the desired results. Starting with Android 4.0 (API Level 14), yourcamera application can provide additional controls to allow your app or users tospecify areas in an image to use for determining focus or light level settings andpass 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, inthat you control them through methods in the Camera.Parameters object. Thefollowing code demonstrates setting two light metering areas for an instanceof Camera:

    // Create an instance of CameramCamera = getCameraInstance();

    // set Camera parametersCamera.Parameters params = mCamera.getParameters();

    if (params.getMaxNumMeteringAreas() > 0){ // check that metering areas are

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    supported List meteringAreas = new ArrayList();

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

    mCamera.setParameters(params);

    The Camera.Area object contains two data parameters: A Rect object for specifyingan area within the cameras field of view and a weight value, which tells thecamera what level of importance this area should be given in light metering orfocus calculations.

    The Rect field in a Camera.Area object describes a rectangular shape mapped on a2000 x 2000 unit grid. The coordinates -1000, -1000 represent the top, left cornerof the camera image, and coordinates 1000, 1000 represent the bottom, rightcorner of the camera image, as shown in the illustration below.

    Figure1.TheredlinesillustratethecoordinatesystemforspecifyingaCamera.Areawithinacamerapreview.TheblueboxshowsthelocationandshapeofancameraareawiththeRectvalues333,333,667,667.

    The bounds of this coordinate system always correspond to the outer edge of theimage visible in the camera preview and do not shrink or expand with the zoom

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    level. Similarly, rotation of the image previewusingCamera.setDisplayOrientation() does not remap the coordinate system.

    Deteco de rostos

    For pictures that include people, faces are usually the most important part of thepicture, and should be used for determining both focus and white balance whencapturing an image. The Android 4.0 (API Level 14) framework provides APIs foridentifying faces and calculating picture settings using face recognitiontechnology.

    Nota: While the face detection feature isrunning, setWhiteBalance(String), setFocusAreas(List)and setMeteringAreas(List) have no effect.

    Using the face detection feature in your camera application requires a fewgeneral steps:

    Check that face detection is supported on the deviceCreate a face detection listenerAdd the face detection listener to your camera objectStart face detection after preview (and after every preview restart)

    The face detection feature is not supported on all devices. You can check that thisfeature is supported by calling getMaxNumDetectedFaces(). An example of thischeck is shown in the startFaceDetection()sample method below.

    In order to be notified and respond to the detection of a face, your cameraapplication must set a listener for face detection events. In order to do this, youmust create a listener class that implementstheCamera.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() ); } }

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    }

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

    mCamera.setFaceDetectionListener(new MyFaceDetectionListener());

    Your application must start the face detection function each time you start (orrestart) the camera preview. Create a method for starting face detection so youcan 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, addyour startFaceDetection() method to boththesurfaceCreated() and surfaceChanged() methods in your preview class, asshown 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

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    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 attemptto start face detection in the onCreate() method of your camera apps mainactivity, as the preview is not available by this point in your applications theexecution.

    Timelapse

    Time lapse video allows users to create video clips that combine pictures taken afew seconds or minutes apart. This feature uses MediaRecorder to record theimages for a time lapse sequence.

    To record a time lapse video with MediaRecorder, you must configure the recorderobject as if you are recording a normal video, setting the captured frames persecond to a low number and using one of the time lapse quality settings, asshown in the code example below.

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_TIME_LAPSE_HIGH));...// Step 5.5: Set the video capture rate to a low numbermMediaRecorder.setCaptureRate(0.1); // capture a frame every 10 seconds

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    These settings must be done as part of a larger configuration procedurefor MediaRecorder. For a full configuration code example, see ConfiguringMediaRecorder. Once the configuration is complete, you start the videorecording as if you were recording a normal video clip. For more informationabout configuring and running MediaRecorder, see Capturing videos.

    Tweet 1 Compartilhar 0

    Related posts:

    1. Opes de armazenamento no Android (Traduo da documentaooficial) O Android fornece diversas opes para que voc salve dados persistentes da aplicao. Asoluo que voc escolher depende da...

    2. Capturando stream HDV de uma camera Firewire no Linux Este artigo umatraduo 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 maioriados 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 oque voc estiver observando para dar a uma tomada escura um apelo adicional ou um...

    5. Utilizando os sensores do Android em sua aplicao para monitoramentodo ambiente externo A plataforma Android idela, especialmente por causa dosdesenvolvvedores Java, para criar aplicaes inovadoras que fazem uso de sensores...

    23deagostode2012 KleberMota Android Android,camera,detecodefaces,foco,mediarecorder,medio,surfaceview,timelapse

    4Like

  • 23/12/2014 UsandoacmeranoAndroid(Traduodadocumentaooficial)|klebermota.eti.br

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

    TutorialdeCanvasParte3Usandoimagens2comentrios8monthsago

    GuestOlkleber,excelentepost,tenhoumadvida:consigogerarodata:URL,copioeatravsdeumgerenciadordemysqlgravoemum

    Comogravarudiodealtaqualidadeparafilmes2comentrios8monthsago

    KleberMotaRonaldo,vocpodeconectaromicrofonediretamenteaogravadorzoomsemproblema,tomandoocuidadodefazermarcaes

    TAMBMEMBLOGKLEBERMOTA

    1Comentrio BlogKleberMota Entrar

    OrdenarporMaisrecente Compartilhar

    Participedadiscusso...

    Responder

    WellingtonLopes 13daysagoOlKleber,estoutentandoimplementaremminhaaplicao,acamerasemvisualizaodaimagem,ouseja,aopressionarumboto,sertiradoafotosemqueousurioperceba.Estouusandoocordova,edproblemasaousaroPictureCallbackpoisnoencontraessaclasse,temalgumaideiaparaestefato?

    OQUEISSO?

    Favorito

    Compartilhar

    Orgulhosamente desenvolvido com WordPress