Android Studio: almacenar foto en el dispositivo
Tags: android, java, espanol, mobile
Published: 2021-12-14 21:23:08

##¡Hola devs!

Hoy les traigo un pequeño tutorial de **Android Studio**.

Como ya leyeron en el titulo explicare como almacenar una foto en android studio lo que haremos es una aplicación android que nos permita utilizar la cámara y guardar la foto tomada en una carpeta del propio dispositivo y mostrarla en un ImageView.




####activity_main.xml

> Nota: Este archivo en formato XML define el diseño de la interfaz de usuario (IU) de la actividad. Contiene un elemento TextView con el texto "Hello, World!"

Primero cambiaremos el ConstraintLayout por un LinearLayout con orientacion vertical y eliminamos el TextView que se genera automáticamente cuando se crea el proyecto y agregamos dos elementos un Button y un ImageView y definimos sus ids.

![IMAGEN1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j9v1dwhu5gks7z9b7bt6.png)

Los ids que se agregaron son:
- btnCamara
- ImageView1

Eso es todo lo que necesitamos realizar en la parte de diseño vamos a la parte de la lógica.


###MainActivity
              
>Nota: Esta es la actividad principal. Es el punto de entrada de tu app. Cuando compilas y ejecutas la app, el sistema inicia una instancia del elemento Activity y carga su diseño. 

En el MainActivity (JAVA) comenzaremos creando 3 variables tipo Button, ImageView, String

- Button btnCamara;
- ImageView ImageView1;
- String rutaImagen;

En el metodo *onCreate* asignaremos los elementos del xml a las variables con el metodo *findViewById()*


```
   btnCamara = findViewById(R.id.btnCamara);
   ImageView1 = findViewById(R.id.ImageView1);
```
Asignamos a btnCamara al metodo *setOnClickListener()* y generar el código correspondiente dando ctrl + space el cual generará un metodo onClick, dentro de este agregaremos una funcion llamada abrirCamara(); que a continuación crearemos

```
        btnCamara.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    abrirCamara();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

```

Antes de crear el método abrirCamara() crearemos otro llamado crearImagen() la cual nos permitirá generar una imagen con un nombre y formato especifico y el código es el siguiente: 

 
#crearImagen()

```
    private File crearImagen() throws IOException {

        String nombreImagen = "foto_";
        File directorio = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File imagen = File.createTempFile(nombreImagen, ".jpg", directorio);

        rutaImagen = imagen.getAbsolutePath();
        return imagen;

    }
```

- nombreImagen  = "foto_" es un prefijo que se utilizara para las fotos generadas.
- directorio tipo FIle permite obtener la ubicación del directorio de la carpeta de la aplicación.
- imagen es la imagen ya generada con el prefijo foto_ y el formato .jpg
- rutaImagen = es la ubicación de la imagen generada.


#abrirCamara()

```
  private void abrirCamara() throws IOException {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        File imagenArchivo = null;

        try{
            imagenArchivo = crearImagen();

        }catch (IOException ex){
            Log.e("Error", ex.toString());
        }


        if(imagenArchivo != null)
        {
            Uri fotoUri = FileProvider.getUriForFile(this, "com.example.myapplication.fileprovider", imagenArchivo);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, fotoUri);
        }

        startActivityForResult(intent, 1);

    }

```

```  
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
```
Con este intent lo que hacemos es abrir la cámara para tomar la foto.

---

```  
try{
     imagenArchivo = crearImagen();

}catch (IOException ex){
     Log.e("Error", ex.toString());
}
```
Con el método crearImagen() creamos la imagen y se la asignamos a imagenArchivo  en caso de que se genere un error lo captamos con el catch 

```
 if(imagenArchivo != null)
        {
            Uri fotoUri = FileProvider.getUriForFile(this, "com.example.myapplication.fileprovider", imagenArchivo);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, fotoUri);
        }

        startActivityForResult(intent, 1);

```

Si a imagen es diferente de null (osea, se genero la imagen correctamente) al intent generado previamente le asignamos la uri  (la cual es la ubicación de la carpeta y el nombre del archivo)    intent.putExtra(MediaStore.EXTRA_OUTPUT, fotoUri) e iniciamos la actividad

startActivityForResult(intent, 1);

![onActivityResult](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pb9v2hi7tfm3eqmnq496.png)

con el método onActivityResult() asignamos al ImageView1 la ruta de la imagen que se genero en crearImagen()

> Nota: Los bitmap o mapa de bits son la estructura donde se almacenan los pixeles que conforman un gráfico, este esta represento como una rejilla rectangular de puntos de color denominada matriz.

Con esto terminamos todo el minitutorial.

Si deseas ver un video explicando todo esto, te invito a visitar el canal 
*Códigos de Programación - MR* en youtube
Donde obtuve esta gran información.

[Ver tutorial](https://www.youtube.com/watch?v=kebuipmQliE&list=PL-Mlm_HYjCo_C2IKBtAJd4a0DfgNS7bhX&index=5&ab_channel=C%C3%B3digosdeProgramaci%C3%B3n-MR)

#Permisos en Manifest

```

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

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

```

agregamos permisos para utilizar la camara y para escribir (Guardar archivos) y tambien agregamos un provider
 ```
   <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.example.myapplication.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

```

[Aquí encontrarán el codigo](https://github.com/fynio/camara_android_studio.git)

#!Listo, ya tenemos lista nuestra aplicación!