/ Android

Copiar Imágenes de un Directorio a Otro - Android

Para copiar imágenes de un directorio a otro en Android, lo realizaremos utilizando la clase File, pero quiero mencionar que existe mejores propuestas en la documentación de Android Studio.

Bueno mis amigos aquí les voy a dejar el código para que puedan copiar sus imágenes de un directorio a otro.

Clase para copiar Archivos

Esta clase sirve para copiar cualquier tipo de fichero.

public class CopiarArchivos {
    private static final String TAG = "logcat";
    private CopiarArchivos(String sourceFile, String destinationFile) {

        try{

            File inFile = new File(sourceFile);
            File outFile = new File(destinationFile);

            FileInputStream in = new FileInputStream(inFile);
            FileOutputStream out =new FileOutputStream(outFile);

            byte[] buffer = new byte[1024];
            int c;


            while( (c = in.read(buffer) ) != -1)
                out.write(buffer, 0, c);

            out.flush();
            in.close();
            out.close();

        } catch(IOException e) {

            Log.e(TAG, "Hubo un error de entrada/salida!!!");

        }
    }

    public static void main(String args[]){
        if(args.length == 2)
            new CopiarArchivos(args[0], args[1]);
    }
}

Te recomiendo el siguiente post Crear Directorios en Almacenamiento Externo y Interno - Android


Uso de la clase en un aplicación

Vamos a utilizar la clase en un ejemplo real, para que tengan una mejor idea, el código es simple ustedes tienen que mejorarlo.

XML

Nombre del archivo xml activity_copiar_archivos.xml.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.a01luisrene.tutoriales.ui.CopiarArchivosActivity">

    <ImageView
        android:id="@+id/iv_imagen"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:scaleType="centerCrop"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@mipmap/ic_launcher"/>

    <Button
        android:id="@+id/bt_seleccionar_imagen"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Buscar imagen"
        android:textSize="14sp"
        android:layout_marginStart="8dp"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginTop="24dp"
        app:layout_constraintTop_toBottomOf="@+id/iv_imagen"/>

    <Button
        android:id="@+id/bt_copiar_imagen"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:text="Copiar imagen"
        android:layout_marginTop="24dp"
        app:layout_constraintTop_toBottomOf="@+id/iv_imagen"
        android:layout_marginEnd="8dp"
        app:layout_constraintRight_toRightOf="parent"/>
</android.support.constraint.ConstraintLayout>

Código Android

Nombre del archivo java CopiarArchivosActivity.java.

//Cambia esta línea de código por la ruta de tu paquete
package com.a01luisrene.tutoriales;

import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.a01luisrene.tutoriales.R;
import com.a01luisrene.tutoriales.io.CopiarArchivos;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class CopiarArchivosActivity extends AppCompatActivity implements View.OnClickListener {
  private static final String IMAGE_SELECT_ALL_TYPE = "image/*";
  public static final String TAG = "logcat";
  public static final String BARRA = "/";

  private static final int REQUEST_CODE_GALLERY = 1;
  private static final int WRITE_STORAGE_PERMISSION = 2;

  Button mBtSeleccionarImagen, mBtGuardarImagen;
  ImageView mIvImagen;
  Uri mUri;
  String mRutaImagenSeleccionada;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_copiar_archivos);
      mBtSeleccionarImagen = (Button) findViewById(R.id.bt_seleccionar_imagen);
      mBtGuardarImagen = (Button) findViewById(R.id.bt_copiar_imagen);
      mIvImagen = (ImageView) findViewById(R.id.iv_imagen);

      mBtSeleccionarImagen.setOnClickListener(this);
      mBtGuardarImagen.setOnClickListener(this);

  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == REQUEST_CODE_GALLERY && resultCode == RESULT_OK && data != null){
        //Almaceno el valor devuelto una ves seleccionada la imagen
        mUri = data.getData();

        //Variable de tipo archivo que almacena la URi de la imagen seleccionada
        File imageFile = new File(getRealPathFromURI(mUri));

        //Guarda la ruta de la imagen seleccionada en un cadena
        mRutaImagenSeleccionada = imageFile.getPath();

        //Muestro la imagen seleccionada
        if(imageFile.exists()){
            Bitmap myBitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());
            mIvImagen.setImageBitmap(myBitmap);
        }

    }

  }

  @Override
  public void onClick(View view) {
    switch (view.getId()){
      case R.id.bt_seleccionar_imagen:
	        seleccionarImagen();
	        break;

      case R.id.bt_copiar_imagen:
          //Compruedo si se selecciono una imagen
          if(mRutaImagenSeleccionada != null){
              //Compruedo si el almacenamiento externo esta disponible
              if(isExternalStorageWritable()){
                  copiarImagen(mRutaImagenSeleccionada);
              }else{
                  Toast.makeText(this, "El almacenamiento externo no esta disponible", Toast.LENGTH_SHORT).show();
              }

          }else {
              Toast.makeText(this, "Seleccione una imagen", Toast.LENGTH_SHORT).show();
          }
          break;
    }
  }
  
  /**
   * VERIFICAMOS SI EL PERMISO A SIDO CONCEDIDO
   */
  @Override
  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      switch (requestCode){
          case WRITE_STORAGE_PERMISSION:
              if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                  abrirGaleriaImg();
              }else {
                  Toast.makeText(this, "¡No tienes permiso para ver, modificar las fotos o imágenes!",
                          Toast.LENGTH_SHORT).show();
              }
              break;
      }
  }

  public void seleccionarImagen(){
    /**
     * SI LA API ES IGUAL A 23 O SUPERIOR PEDIMOS PERMISOS EN TIEMPO DE EJECUCIÓN
     */

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
        //Habilitar permisos para la version de API 23 a mas

        int verificarPermisoWriteExternalStorage = ContextCompat
                .checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);

        boolean write_external_storage = shouldShowRequestPermissionRationale
                (Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if(verificarPermisoWriteExternalStorage != PackageManager.PERMISSION_GRANTED){
            //solicitar permiso
            if(write_external_storage){
                mostrarExplicacion();
            }else{

                String[] read_write_permission = {Manifest.permission.WRITE_EXTERNAL_STORAGE};

                requestPermissions(read_write_permission, WRITE_STORAGE_PERMISSION);
            }

        }else{
            abrirGaleriaImg();
        }
    }else{
        abrirGaleriaImg();
    }
  }
  public void abrirGaleriaImg(){
    Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    i.setType(IMAGE_SELECT_ALL_TYPE);
    startActivityForResult(i, REQUEST_CODE_GALLERY);
  }

  private void mostrarExplicacion() {
    new AlertDialog.Builder(this)
        .setTitle("Autorización")
        .setMessage("Necesito permiso leer y manipular las fotos e imágenes de tu dispositivo.")
        .setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                //pedir permiso

                try {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, WRITE_STORAGE_PERMISSION);
                    }
                } catch (Exception e) {
                    throw new IllegalArgumentException();
                }

            }
        }).setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            //Desplegar mensaje
            Toast.makeText(CopiarArchivosActivity.this, "Haz rechazado la petición de permiso de lectura y escritura de archivos", Toast.LENGTH_SHORT).show();
        }
    })
    .show();
  }

  public void copiarImagen(String rutaImagenSeleccionada) {
    //Obtengo el nombre de la imagen que tendra mi nuevo archivo con la extensión igual
    //al archvio seleccionado gracias a la función obtenerExtensionArchivo()
    String nombreImagen = nombreImagen(rutaImagenSeleccionada);

    //Nombre que le asignare al directorio donde se guardaran las imágenes
    String nombreDirectorio = "imagenes";

    //Obtengo la ruta de la carpeta creada (imagenes)
    String rutaDirectorio = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
            + BARRA
            + nombreDirectorio;

    //Declaro la variable file con la ruta del archivo antes obtenido
    File fileDirectorio = new File(rutaDirectorio);

    //Ruta donde se guardara el archivo + el nombre del archivo
    String rutaFinalImagen = rutaDirectorio + BARRA + nombreImagen;

    //Almaceno la ruta de la imagen seleccionada (donde se encuentra el archivo a copiar) y
    // ruta final (donde se copiara la imagen)
    String[] args = {rutaImagenSeleccionada, rutaFinalImagen};

    //comprobar si la carpeta "IMG_prueba" existe
    if (fileDirectorio.exists() && fileDirectorio.isDirectory()) {
        //Copio el archivo seleccionado
        CopiarArchivos.main(args);
        //Muestro un mensjase
        Toast.makeText(this, "Imagen copiada en: " + rutaDirectorio, Toast.LENGTH_SHORT).show();

    } else {//Se ejecuta si no existe el directorio

        //Si la carpeta aun no existe la creo
        crearDirectorioPublico(nombreDirectorio);

        //Copio el archivo seleccionado
        CopiarArchivos.main(args);

        //Muestro un mensjase
        Toast.makeText(this, "Imagen copiada en: "+ rutaDirectorio, Toast.LENGTH_SHORT).show();
    }
  }

  //Función para obtener la uri de la imagen seleccionada
  public String getRealPathFromURI(Uri contentUri) {
    Cursor cursor = null;
    int column_index;
    String ruta = null;

    try {
        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = getContentResolver().query(contentUri,  proj, null, null, null);

        if (cursor != null){

            column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            ruta = cursor.getString(column_index);

        }
        return ruta;

    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
  }


  private String nombreImagen(String rutaImagenSeleccionada){
    String prefijo = "IMG_";
    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmmss", Locale.getDefault()).format(new Date());
    //Extraigo la extension de la imagen seleccionada
    String extension = String.format(".%s", obtenerExtensionArchivo(rutaImagenSeleccionada));
    return String.format("%s%s%s",prefijo,timeStamp,extension);
  }

  public static String obtenerExtensionArchivo(String fileName) {
    return fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
  }

  public File crearDirectorioPublico(String nombreDirectorio) {
    //Crear directorio público en la carpeta Pictures.
    File directorio = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), nombreDirectorio);
    //Muestro un mensaje en el logcat si no se creo la carpeta por algun motivo
    if (!directorio.mkdirs())
        Log.e(TAG, "Error: No se creo el directorio público");

    return directorio;
  }
  //Función para verificar si el almacenamiento externo esta disponible
  private boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    return Environment.MEDIA_MOUNTED.equals(state);
  }

}

Espero les sirva 😉

Luis Rene Mas Mas

Luis Rene Mas Mas

Soy desarrollador front-end, me encanta las nuevas tecnologías web, administrar este blog es mi pasatiempo favorito.

Leer Más