miércoles, 18 de mayo de 2022

51 - Tomar un video y grabarlo en un archivo (mediante Intent)

 La forma más sencilla de capturar un video en una aplicación desarrollada en Android es mediante el software que provee el sistema operativo Android. Invocamos la aplicación de tomar videos mediante la clase Intent.



Tiene como ventaja que la interfaz le es familiar al usuario, ya que muchas aplicaciones utilizan esta característica y nos facilita mucho la codificación.

Problema:

Confeccionaremos una aplicación que permita ingresar un nombre de archivo con extensión mp4 en un EditText. Luego al presionar un botón lanzar el Activity que proporciona Android para tomar un video. Grabar el archivo en la memoria externa del dispositivo. Disponer un segundo botón para recuperar un archivo mp4 almacenado en el dispositivo.

Finalmente crearemos un segundo Activity para mostrar en un ListView todos los nombres de archivos de videos almacenados por la aplicación y al presionar uno de ellos procederemos a mostrarlo en un VideoView.

Crear un proyecto llamado "Proyecto056".

Lo primero que haremos es modificar el archivo AndroidManifest.xml para permitir a la aplicación almacenar archivos en la memoria externa:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tutorialesprogramacionya.proyecto056">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    
    
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Es decir agregamos la línea:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

La interfaz visual de la ventana principal es:

Tomar video

Disponemos un EditText, 3 botones y un objeto de la clase VideoView. El archivo "activity_main.xml" que implementa la interfaz visual es:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.tutorialesprogramacionya.proyecto056.MainActivity">

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:ems="10"
        android:hint="Nombre del archivo"
        android:inputType="textPersonName"
        android:text="video1.mp4" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/editText1"
        android:onClick="tomarVideo"
        android:text="Tomar video" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText1"
        android:layout_toRightOf="@+id/button1"
        android:onClick="recuperarVideo"
        android:text="Recuperar video" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button2"
        android:layout_alignBottom="@+id/button2"
        android:layout_alignParentRight="true"
        android:onClick="ver"
        android:text="ver" />

    <VideoView
        android:id="@+id/videoView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/button1" />
</RelativeLayout>

Los tres botones tienen cargadas la propiedad onClick con el método respectivo:

        android:onClick="tomarVideo"


        android:onClick="recuperarVideo"

        y

        android:onClick="ver"

El código java asociado a esta vista se encuentra en el archivo "MainActivity.java" y es el siguiente:

package com.tutorialesprogramacionya.proyecto056;

import android.content.Intent;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.VideoView;

import java.io.File;

public class MainActivity extends AppCompatActivity {

    private EditText et1;
    private VideoView vv1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et1=(EditText)findViewById(R.id.editText1);
        vv1=(VideoView)findViewById(R.id.videoView1);
    }

    public void tomarVideo(View v) {
        Intent intento1 = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        File video = new File(getExternalFilesDir(null), et1.getText().toString());
        intento1.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(video));
        startActivity(intento1);
    }


    public void recuperarVideo(View v) {
        vv1.setVideoURI(Uri.parse(getExternalFilesDir(null)+"/"+et1.getText().toString()));
        vv1.start();
    }


    public void ver(View v) {
        Intent intento1=new Intent(this,Actividad2.class);
        startActivity(intento1);
    }
}

Definimos las variables et1 y vv1:

    private EditText et1;
    private VideoView vv1;

En el método onCreate obtenemos la referencia de los objetos definidos en el archivo XML:

        et1=(EditText)findViewById(R.id.editText1);
        vv1=(VideoView)findViewById(R.id.videoView1);

Cuando se presiona el botón para grabar un video creamos un objeto de la clase Intent y pasamos como dato la constante ACTION_VIDEO_CAPTURE definida en la clase MediaStore:

        Intent intento1 = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

Creamos un objeto de la clase File indicando en el primer parámetro el path donde se creará el archivo y lo obtenemos llamando al método getExternalFilesDir(null), y como segundo parámetro indicamos el nombre de archivo mp4 donde se guardará el video:

        File video = new File(getExternalFilesDir(null), et1.getText().toString());

Pasamos al otro Activity la referencia del archivo que debe crear:

        intento1.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(video));

Finalmente lanzamos el Activity que permite tomar el video:

        startActivity(intento1);

Para recuperar el video almacenada en la memoria externa procedemos a llamar al método setVideoUri y pasar un objeto de la clase Uri indicando el path completo donde se encuentra el archivo mp4, finalmente llamamos al método start para comenzar a mostrarlo:

        vv1.setVideoURI(Uri.parse(getExternalFilesDir(null)+"/"+et1.getText().toString()));
        vv1.start();

Cuando se presiona el botón ver procedemos a crear un Activity que seguidamente procederemos a crear:

        Intent intento1=new Intent(this,Actividad2.class);
        startActivity(intento1);

Ahora procederemos a crear la segunda actividad. Para esto presionamos el botón derecho del mouse sobre el nombre del paquete de nuestro proyecto y en el menú que aparece seleccionamos New -> Activity -> Empty Activity:

Tomar foto

En el diálogo que aparece procedemos a cargar en "Activity Name" el valor "Actividad2":

Tomar foto

Luego de presionar "Finish" ya tenemos los dos archivos : XML y java de nuestra aplicación.

En el archivo activity_actividad2.xml procedemos a crear la siguiente interfaz:

Tomar video

El contenido para crear esta pantalla está en el archivo activity_actividad2.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_actividad2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.tutorialesprogramacionya.proyecto056.Actividad2">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:orientation="vertical" >

        <ListView
            android:id="@+id/listView1"
            android:layout_width="match_parent"
            android:layout_height="100dp" >

        </ListView>

        <VideoView
            android:id="@+id/videoView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>
</RelativeLayout>

El archivo java asociado a esta actividad se llama "Actividad2.java" y su contenido es:

package com.tutorialesprogramacionya.proyecto056;

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.VideoView;

import java.io.File;

public class Actividad2 extends AppCompatActivity {

    private ListView lv1;
    private VideoView vv1;
    private String[] archivos;
    private ArrayAdapter<String> adaptador1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_actividad2);

        File dir=getExternalFilesDir(null);
        archivos=dir.list();
        adaptador1=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,archivos);
        lv1=(ListView)findViewById(R.id.listView1);
        lv1.setAdapter(adaptador1);

        vv1=(VideoView)findViewById(R.id.videoView1);

        lv1.setOnItemClickListener(new AdapterView.OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                    long arg3) {
                vv1.setVideoURI(Uri.parse(getExternalFilesDir(null)+"/"+archivos[arg2]));
                vv1.start();
            }});

    }
}

Definimos cuatro variables:

    private ListView lv1;
    private VideoView vv1;
    private String[] archivos;
    private ArrayAdapter<String> adaptador1;

Recuperamos la lista de todos los archivos almacenados en la memoria externa y los guardamos en un vector:

        File dir=getExternalFilesDir(null);
        archivos=dir.list();

Creamos el ArrayAdapter con todos los nombres de archivos y los visualizamos en el ListView:

        adaptador1=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,archivos);
        lv1=(ListView)findViewById(R.id.listView1);
        lv1.setAdapter(adaptador1);

Mostramos en un VideoView el contenido del video que seleccionamos del ListView:

            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                    long arg3) {
                vv1.setVideoURI(Uri.parse(getExternalFilesDir(null)+"/"+archivos[arg2]));
                vv1.start();
            }});

Otra parte muy importante para probar esta aplicación con el emulador de Android es su correcta configuración. Entremos a la opción AVD Manager:

Tomar foto

En este diálogo entremos a modificar la configuración del emulador que estemos utilizando:

Tomar foto

Y activamos la cámara:

Tomar foto

Este proyecto lo puede descargar en un zip desde este enlace: proyecto056.zip

No hay comentarios:

Publicar un comentario