Cámara de fotos como Intent

Esta es una clase que nos permite llamar con facilidad a la cámara de fotos de nuestro dispositivo y recuperar el archivo en forma de PImage.

Requeriremos para su uso una serie de pasos. Primero las declaraciones; esta clase permite fotografiar y obtener el resultado en un archivo de nombre test.jpg ubicado en la carpeta temporal de Android sita en la tarjeta de memoria externa. (El porqué de esto: stackoverflow..).

1. Declararemos entonces la clase así como el nombre de esta ruta:

// Camara de fotos
CamaraFoto camFoto;
PImage foto;
String fotopath;

2. En el setup podremos entonces inicializar nuestros objetos:

  // Inicializacion de la camara (y archivo temporal)
  camFoto = new CamaraFoto(this);
  if (fotopath == null) fotopath = camFoto.createFotoPath(); 

3. Para tomar la foto:

    camFoto.tomaFoto(fotopath);

4. Para cargar y mostrar la imagen, recurrimos a este método _demasiado casero_ dentro de draw:

  if (foto != null) {
    image(foto, 0, 0, screenHeight, screenWidth);
  }
  else if (fotopath != null) {
    File _photoFile = new File(fotopath);
    if (_photoFile.exists() != false && _photoFile.length() > 0) { // peligro, peligro... sólo debería ejecutarse una vez
      foto = loadImage(fotopath);
    }
  }

clase camaraFoto

// Necesarios para crear archivo temporal de foto
import android.os.Environment;
import android.content.Context;
 
// Necesarios para lanzar el app de la camara
import android.content.Intent;
import android.provider.MediaStore;
import android.net.Uri;
 
// Necesarios para los dialogos de alerta
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
 
final int TAKE_PICTURE = 2;
 
class CamaraFoto {
 
  String storageState;
  PApplet parent;
 
  CamaraFoto(PApplet parent_) {
    storageState = Environment.getExternalStorageState();
    parent = parent_;
  }
 
  String createFotoPath() {
    println("Creando path para archivo test.jpg...");
    if (storageState.equals(Environment.MEDIA_MOUNTED)) {
      fotopath = Environment.getExternalStorageDirectory().getName() + File.separatorChar + "Android/data/" + parent.getPackageName() + "/files/" + "test" + ".jpg";
    }  
    else {
      new AlertDialog.Builder(parent)
        .setMessage("External Storeage (SD Card) is required.\n\nCurrent state: " + storageState)
          .setCancelable(true).create().show();
    }
    return fotopath;
  }
 
  void tomaFoto(String fotopath) {
    File _photoFile;
 
    if (fotopath != null) {
      _photoFile = new File(fotopath);
      try {
        if (_photoFile.exists() == false) {
          _photoFile.getParentFile().mkdirs();
          _photoFile.createNewFile();
        }
      } 
      catch (IOException e) {
      }
 
      Uri _fileUri = Uri.fromFile(_photoFile);
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE );
      intent.putExtra( MediaStore.EXTRA_OUTPUT, _fileUri);
      startActivityForResult(intent, TAKE_PICTURE);
    }
  }
}

Ejemplo completo

El siguiente ejemplo muestra cómo subir a un servidor de testing la imagen obtenida de la cámara de fotos del dispositivo móvil. La imagen es subida a un directorio público del servidor, su resolución modificada y renombrada con el nombre “test.jpg”.

Descarga el ejemplo aquí: fileupload_camara.zip