Cámara fotográfica
Introdución
- Neste curso só se vai introducir como manexar a cámara de fotos e amosar a foto obtida.
- Para ver como gardar as imaxes e como incluso gravar e manipula vídeos hai un apartado final onde se indica como proceder.
As clases que interveñen son:
- Clase Camera: danos acceso á cámara, as súas características. Usarémola se facemos unha aplicación na que queiramos xestionar a cámara por nos mesmos.
Para facer uso da cámara podemos utilizar un Intent, evitándonos ter que deseñar a aplicación para xestionar a cámara.
Permisos necesarios a engadir no arquivo AndroidManifest.xml:
- Permiso para facer uso da cámara:
<uses-permission android:name="android.permission.CAMERA" />
Nota: Se usamos a opción de chamar á cámara cun Intent non necesitamos dito permiso.
- Permiso para indicar que a nosa aplicación fai uso da cámara (Ollo que é uses-feature):
<uses-feature android:name="android.hardware.camera" required="true"/>
Se queremos facer uso doutras ‘características’, tanto da cámara coma doutro hardware que ten o dispositivo móbil, consultar: http://developer.android.com/guide/topics/manifest/uses-feature-element.html#hw-features
Desta forma Google Play impedirá que se instale á aplicación se o dispositivo non ten o hardware necesario coas características especificadas.
Neste caso, a nosa aplicación está requirindo ó uso da cámara, pero pode ocorrer que non a necesite para que funcione (podemos limitar a funcionalidade da nosa aplicación se o dispositivo non ten cámara, por exemplo). Para indicar isto temos que poñer:
<uses-feature android:name="android.hardware.camera" android:required="false" />
Chamaremos a unha aplicacións e recolleremos o resultado de volta, que será a foto.
Os pasos a seguir son:
- Crear un Intent que sexa do tipo:
- MediaStore.ACTION_IMAGE_CAPTURE : Captura unha imaxe.
Intent intento = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
- Chamar ó método startActivityForResult().
- Neste momento o S.O. lanzará unha aplicación para recoller a imaxe.
- Lembrar que con esta forma de chamar a unha activity, esperamos un resultado (a foto).
startActivityForResult(intento, REQUEST_CODE_CAMARA);
- Obter o resultado da aplicación lanzada. Para iso temos que desenrolar o método onActivityResult() da nosa Activity.
- Nó método onActivityResult() imos recoller a imaxe vén no campo "data" dentro de getExtras do obxecto Bundle:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { Bitmap bitMap= data.getExtras().get("data")); ......... }
- Unha vez temos o BitMap podemos visualizalo nun control ImageView da seguinte forma:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { Bitmap bitMap= data.getExtras().get("data")); imgView.setImageBitmap(bitMap); }
- Sendo imgView un obxecto da clase ImageView.
A Cámara
- Segundo o AVD/Dispostivo este pode ter cámara traseira e tamén dianteira, para os famoso autoretratos, que todos damos en chamar Selfies
- No caso dun AVD a cámara pode ser emulada ou usar a do ordenador real se dispón dela.
- Nesta imaxe amósase que se vai usar a cámara emulada.
Caso práctico
- Crear o proxecto: U5_10_Fotos
O xml do layout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/bFoto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onBotonClick"
android:text="Facer Foto" />
<ImageView
android:id="@+id/imgvwFoto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="foto a sacar"
android:src="@drawable/ic_launcher" />
</LinearLayout>
O Código java da aplicación
package com.example.u5_10_fotos;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
public class U5_10_Fotos extends Activity {
private final int REQUEST_CODE_CAMARA = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u5_10__fotos);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.u5_10__fotos, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void onBotonClick(View v) {
Intent intento = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intento, REQUEST_CODE_CAMARA);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if (requestCode == REQUEST_CODE_CAMARA) {
if (resultCode == RESULT_OK) {
if (data == null) {
Toast.makeText(this, "NON HAI IMAXE", Toast.LENGTH_LONG).show();
return;
}
ImageView imgview = (ImageView) findViewById(R.id.imgvwFoto);
imgview.setImageBitmap((Bitmap) data.getExtras().get("data"));
} else if (resultCode == RESULT_CANCELED) {
// Foto cancelada
} else {
// Fallo na captura da foto.
}
}
}
}
- Liñas 43-44: Creamos un intent e lanzámolo esperando un resultado (a foto, neste caso).
- Liñas 48-68: Recibimos o resultado da activity secundaria (a que manexa a cámara) e comprobamos se o código devolto foi o mesmo que usamos para lanzar a cámara e tamén comprobamos se recibimos unha imaxe que nese caso imos amosar na vista ImageView, unha vez que a recollemos da chave "data" do campo data.
Afondar sobre o uso da cámara e vídeo
- Para ter un coñecemento máis profundo do uso da cámara:
- Gardar as fotos,
- Gravar e gardar vídeos,
- Audio,
- Etc.
- Pódese consultar o seguinte enlace do curso avanzado de Android: PDM Avanzado Captura de Vídeo / Imaxes
-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2015).