Cámara fotográfica

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda

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:
1 <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):
1 <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:

1 <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:
1 Intent intento = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);


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).
1 startActivityForResult(intento, REQUEST_CODE_CAMARA);
  • Nó método onActivityResult() imos recoller a imaxe vén no campo "data" dentro de getExtras do obxecto Bundle:
1 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
2 
3   Bitmap bitMap= data.getExtras().get("data"));
4   .........
5 }
Unha vez temos o BitMap podemos visualizalo nun control ImageView da seguinte forma:
1 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
2 
3   Bitmap bitMap= data.getExtras().get("data"));
4   imgView.setImageBitmap(bitMap);
5 }
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.

Android 2014 U5 10 Fotos 01.jpg

Caso práctico

  • Crear o proxecto: U5_10_Fotos


O xml do layout

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6 
 7     <Button
 8         android:id="@+id/bFoto"
 9         android:layout_width="match_parent"
10         android:layout_height="wrap_content"
11         android:onClick="onBotonClick"
12         android:text="Facer Foto" />
13 
14     <ImageView
15         android:id="@+id/imgvwFoto"
16         android:layout_width="match_parent"
17         android:layout_height="match_parent"
18         android:contentDescription="foto a sacar"
19         android:src="@drawable/ic_launcher" />
20 
21 </LinearLayout>


O Código java da aplicación

 1 package com.example.u5_10_fotos;
 2 
 3 import android.app.Activity;
 4 import android.content.Intent;
 5 import android.graphics.Bitmap;
 6 import android.os.Bundle;
 7 import android.provider.MediaStore;
 8 import android.view.Menu;
 9 import android.view.MenuItem;
10 import android.view.View;
11 import android.widget.ImageView;
12 import android.widget.Toast;
13 
14 public class U5_10_Fotos extends Activity {
15 	private final int REQUEST_CODE_CAMARA = 1;
16 
17 	@Override
18 	protected void onCreate(Bundle savedInstanceState) {
19 		super.onCreate(savedInstanceState);
20 		setContentView(R.layout.activity_u5_10__fotos);
21 	}
22 
23 	@Override
24 	public boolean onCreateOptionsMenu(Menu menu) {
25 		// Inflate the menu; this adds items to the action bar if it is present.
26 		getMenuInflater().inflate(R.menu.u5_10__fotos, menu);
27 		return true;
28 	}
29 
30 	@Override
31 	public boolean onOptionsItemSelected(MenuItem item) {
32 		// Handle action bar item clicks here. The action bar will
33 		// automatically handle clicks on the Home/Up button, so long
34 		// as you specify a parent activity in AndroidManifest.xml.
35 		int id = item.getItemId();
36 		if (id == R.id.action_settings) {
37 			return true;
38 		}
39 		return super.onOptionsItemSelected(item);
40 	}
41 
42 	public void onBotonClick(View v) {
43 		Intent intento = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
44 		startActivityForResult(intento, REQUEST_CODE_CAMARA);
45 	}
46 
47 	@Override
48 	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
49 		// TODO Auto-generated method stub
50 		if (requestCode == REQUEST_CODE_CAMARA) {
51 			if (resultCode == RESULT_OK) {
52 
53 				if (data == null) {
54 					Toast.makeText(this, "NON HAI IMAXE", Toast.LENGTH_LONG).show();
55 					return;
56 				}
57 
58 				ImageView imgview = (ImageView) findViewById(R.id.imgvwFoto);
59 				imgview.setImageBitmap((Bitmap) data.getExtras().get("data"));
60 
61 			} else if (resultCode == RESULT_CANCELED) {
62 				// Foto cancelada
63 			} else {
64 				// Fallo na captura da foto.
65 			}
66 		}
67 
68 	}
69 
70 }
  • 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.




-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2015).