Intents de cámara

Para realizar acciones básicas de la cámara, como capturar una foto o un video, con la aplicación de cámara predeterminada del dispositivo, no necesitas integrarla a la biblioteca de la cámara. En su lugar, usa un Intent.

Cómo tomar una foto con una app de cámara

Android delega las acciones a otras aplicaciones invocando un Intent. Este proceso tiene tres partes: el Intent en sí, una llamada para iniciar la Activity externa y un poco de código para controlar los datos de la imagen cuando el foco vuelve a tu actividad.

La siguiente es una función que invoca un Intent para capturar una foto.

Kotlin

val REQUEST_IMAGE_CAPTURE = 1
 
private fun dispatchTakePictureIntent() {
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
    } catch (e: ActivityNotFoundException) {
        // display error state to the user
    }
}

Java

static final int REQUEST_IMAGE_CAPTURE = 1;
 
private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    } catch (ActivityNotFoundException e) {
        // display error state to the user
    }
}

Cómo grabar un video con una app de cámara

También puedes invocar un Intent para capturar un video.

Kotlin

val REQUEST_VIDEO_CAPTURE = 1
 
private fun dispatchTakeVideoIntent() {
    Intent(MediaStore.ACTION_VIDEO_CAPTURE).also { takeVideoIntent ->
        takeVideoIntent.resolveActivity(packageManager)?.also {
            startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE)
        } ?: run {
          //display error state to the user
        }
    }
}

Java

static final int REQUEST_VIDEO_CAPTURE = 1;
 
private void dispatchTakeVideoIntent() {
    Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
    }
    else {
      //display error state to the user
    }
}

El método startActivityForResult() está protegido por una condición que llama a resolveActivity(), que muestra el primer componente de actividad que puede controlar el Intent. Realiza esta comprobación para asegurarte de estar invocando un Intent que no hará fallar tu app.

Recursos adicionales

Para las acciones básicas de la cámara, usa un Intent. De lo contrario, se recomienda usar las bibliotecas Camera2 y CameraX para algo más complejo que la captura de imágenes o videos básicos.