Intents de câmera

Para realizar ações básicas, como capturar uma foto ou um vídeo usando o app de câmera padrão do dispositivo, não é necessário fazer a integração com uma biblioteca de câmera. Em vez disso, use uma Intent.

Tirar uma foto com um app de câmera

O Android delega ações a outros aplicativos invocando uma Intent. Esse processo envolve três partes: a própria Intent, uma chamada para iniciar a Activity externa e um código para processar os dados da imagem quando o foco retorna à sua atividade.

Veja esta função que invoca uma Intent para capturar uma 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
    }
}

Gravar um vídeo com um app de câmera

Também é possível invocar uma Intent para capturar um vídeo.

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

O método startActivityForResult() é protegido por uma condição que chama resolveActivity(), que retorna o primeiro componente da atividade que pode processar a Intent. Faça essa verificação para garantir que você está invocando uma Intent que não vai causar uma falha no seu app.

Outros recursos

Para ações básicas da câmera, use uma Intent. Caso contrário, é recomendável usar as bibliotecas Camera2 e CameraX para algo mais complexo do que a captura básica de imagem ou vídeo.