Graba videos

En esta lección, se explica cómo capturar videos con las aplicaciones de cámara existentes.

Tu aplicación tiene una función, y la integración de videos es solo una pequeña parte de ella. El objetivo es tomar videos con un mínimo de complicaciones, y no reinventar la videocámara. Afortunadamente, la mayoría de los dispositivos con Android ya tienen una aplicación de cámara que graba videos. En esta lección, aprenderás cómo hacer que lo haga por ti.

Consulta los siguientes recursos relacionados:

Solicita la función de cámara

Para anunciar que tu aplicación depende de tener una cámara, coloca una etiqueta <uses-feature> en el archivo de manifiesto:

    <manifest ... >
        <uses-feature android:name="android.hardware.camera"
                      android:required="true" />
        ...
    </manifest>
    

Si tu aplicación usa una cámara para funcionar, pero no la requiere, configura android:required como false. De esa forma, Google Play permitirá que dispositivos sin cámara descarguen la aplicación. Luego, es tu responsabilidad verificar la disponibilidad de la cámara en el tiempo de ejecución. Para ello, llama a hasSystemFeature(PackageManager.FEATURE_CAMERA). Si no hay una cámara disponible, debes inhabilitar las funciones de la cámara.

Graba un video con una app de cámara

La forma en que Android delega acciones a otras aplicaciones es mediante la invocación de un Intent que describe lo que deseas que se haga. Este proceso tiene tres partes: el Intent en sí, una llamada para iniciar el Activity externo y un poco de código para manejar los datos de video cuando el foco vuelve a tu actividad.

A continuación, hay una función que invoca un intent para capturar video.

Kotlin

    const val REQUEST_VIDEO_CAPTURE = 1

    private fun dispatchTakeVideoIntent() {
        Intent(MediaStore.ACTION_VIDEO_CAPTURE).also { takeVideoIntent ->
            takeVideoIntent.resolveActivity(packageManager)?.also {
                startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE)
            }
        }
    }
    

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

Observa que el método startActivityForResult() está protegido por una condición que llama a resolveActivity(), que muestra el primer componente de actividad que puede manejar el intent. Realizar esta verificación es importante porque, si llamas a startActivityForResult() con un intent que ninguna app puede manejar, tu app fallará. Por lo tanto, siempre que el resultado no sea nulo, se puede usar el intent.

Ve el video

La aplicación de cámara de Android muestra el video en el Intent entregado a onActivityResult() como un Uri que apunta a la ubicación del video almacenado. Con el siguiente código, se recupera este video y se muestra en un VideoView.

Kotlin

    override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent) {
        if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) {
            val videoUri: Uri = intent.data
            videoView.setVideoURI(videoUri)
        }
    }
    

Java

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) {
            Uri videoUri = intent.getData();
            videoView.setVideoURI(videoUri);
        }
    }