Androideity

Programación android en español, tutoriales, documentación, noticias, smartphones, tablets, programación android, aplicaciones android

Escribiendo archivos en la memoria externa (SD card)

| | 17 Comentarios

Volviendo a retomar el tema de archivos, en esta ocación vamos a realizar una aplicación que me permita escribir un archivo de texto en la memoria externa (SD card) de nuestros dispositivos android, ya que en ocaciones nos resultará mas útil almacenar en la SD card debido a que su capacidad, por lo regular, siempre será mas grande que la memoria interna de nuestro dispositivo. También esto nos permitará compartir los archivos mas fácilmente con otros usuarios.

Así que para comenzar les recomiendo que tomen de base la aplicacion del tuto “Escibiendo archivos en la memoria interna“ ya que la manera en que se escribe y se lee el archivo es la misma, lo único que cambiará es el acceso para poder almancenar en la memoria externa del dispositivo. Asi que sin mas vamos a comenzar:

1)      Creamos un proyecto android llamado ArchivosEnSD con la API 10.
2)      Nos vamos a nuestro archivo Manifest y agregamos la siguiente linea de código para indicar que nuestra aplicación tendra permiso de escribir en medios de almacenamiento externo.

2)      En seguida diseñaremos nuestra UI la cual tendrá una caja de texto y dos botones. Les dejo el contenido del archivo main.xml.

4) Ahora importemos todo los que necesitamos en nuestra clase MainActivity.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

5)       Enseguida en nuestra clase MainActivity implementaremos la interface OnCLickListener con el fin de implementar el método onCLick agregando el código funcional para cada uno de los botones que agregamos en nuestra UI. A continuación se muestra el código de cómo quedaría nuestro clase MainActivity.

public class MainActivity extends Activity implements OnClickListener {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        txtTexto = (EditText)findViewById(R.id.txtTexto);
        btnGuardar = (Button)findViewById(R.id.btnGuardar);
        btnAbrir = (Button)findViewById(R.id.btnAbrir);
        btnGuardar.setOnClickListener(this);
        btnAbrir.setOnClickListener(this);
    }

	@Override
	public void onClick(View arg0) {
		// TODO Auto-generated method stub
	}
}

6) Después declaremos nuestras variables que representarán en código java los botones y caja de texto que se encuentran en nuestra UI.

	private EditText txtTexto;
	private Button btnGuardar;
	private Button btnAbrir;
	private static final int READ_BLOCK_SIZE=100;

7) Ahora en el método onCreate() haremos referencia a los controles que se encuentran en nuestra UI para poder manipularlos como objetos en nuestro código java y de una vez vamos a establecer quién será su clase onCLickListener.

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        txtTexto = (EditText)findViewById(R.id.txtTexto);
        btnGuardar = (Button)findViewById(R.id.btnGuardar);
        btnAbrir = (Button)findViewById(R.id.btnAbrir);
        btnGuardar.setOnClickListener(this);
        btnAbrir.setOnClickListener(this);
    }

8) En el método onClick() implementaremos el bloque de código que se encargará de escribir y leer un archivo de texto en la memoria externa de nuestro dispositivo Android. A diferencia con el código de la aplicación anterior, en esta aplicación estamos adicionando unas lineas de código las cuales nos permitirán obtener el directorio de la memoria externa para después crear un nuevo directorio dentro de ella y sobre ese nuevo crear nuestro archivo de texto. También, de esta misma forma sera mas fácil a accesar a nuestro archivo creado para despues leerlo. Se incluye una validación para el caso de que no se tenga un medio de almacenamiento externo.

@Override
	public void onClick(View arg0) {
		// TODO Auto-generated method stub
		File sdCard, directory, file = null;

		try {
			// validamos si se encuentra montada nuestra memoria externa
			if (Environment.getExternalStorageState().equals("mounted")) {

				// Obtenemos el directorio de la memoria externa
				sdCard = Environment.getExternalStorageDirectory();

				if (arg0.equals(btnGuardar)) {
					String str = txtTexto.getText().toString();

					// Clase que permite grabar texto en un archivo
					FileOutputStream fout = null;
					try {
						// instanciamos un onjeto File para crear un nuevo
						// directorio
						// la memoria externa
						directory = new File(sdCard.getAbsolutePath()
								+ "/Mis archivos");
						// se crea el nuevo directorio donde se cerara el
						// archivo
						directory.mkdirs();

						// creamos el archivo en el nuevo directorio creado
						file = new File(directory, "MiArchivo.txt");

						fout = new FileOutputStream(file);

						// Convierte un stream de caracteres en un stream de
						// bytes
						OutputStreamWriter ows = new OutputStreamWriter(fout);
						ows.write(str); // Escribe en el buffer la cadena de texto
						ows.flush(); // Volca lo que hay en el buffer al archivo
						ows.close(); // Cierra el archivo de texto

						Toast.makeText(getBaseContext(),
								"El archivo se ha almacenado!!!",
								Toast.LENGTH_SHORT).show();

						txtTexto.setText("");

					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}

				if (arg0.equals(btnAbrir)) {
					try {

						//Obtenemos el direcorio donde se encuentra nuestro archivo a leer
						directory = new File(sdCard.getAbsolutePath()
								+ "/Mis archivos");

						//Creamos un objeto File de nuestro archivo a leer
						file = new File(directory, "MiArchivo.txt");

						//Creamos un objeto de la clase FileInputStream
						//el cual representa un stream del archivo que vamos a leer
						FileInputStream fin = new FileInputStream(file);

						//Creaos un objeto InputStreamReader que nos permitira
						//leer el stream del archivo abierto
						InputStreamReader isr = new InputStreamReader(fin);

						char[] inputBuffer = new char[READ_BLOCK_SIZE];
						String str = "";

						// Se lee el archivo de texto mientras no se llegue al
						// final
						// de él
						int charRead;
						while ((charRead = isr.read(inputBuffer)) > 0) {
							// Se lee por bloques de 100 caracteres
							// ya que se desconoce el tamaño del texto
							// Y se va copiando a una cadena de texto
							String strRead = String.copyValueOf(inputBuffer, 0,
									charRead);
							str += strRead;

							inputBuffer = new char[READ_BLOCK_SIZE];
						}

						// Se muestra el texto leido en la caje de texto
						txtTexto.setText(str);

						isr.close();

						Toast.makeText(getBaseContext(),
								"El archivo ha sido cargado",
								Toast.LENGTH_SHORT).show();

					} catch (IOException e) {
						// TODO: handle exception
						e.printStackTrace();
					}

				}
			}else{
				Toast.makeText(getBaseContext(),
						"El almacenamineto externio no se encuentra disponible",
						Toast.LENGTH_LONG).show();
			}
		} catch (Exception e) {
			// TODO: handle exception

		}

	}

9)       Ya implementado todo el código anterior tenderemos ya terminado una aplicación en Android que permite Almacenar y Abrir un archivo de texto en nuestro en la memoria externa de nuestro dispositivo Android.

De esta manera finalizamos el tema de archivos.
Si alguno de nuestros lectores les surge alguna duda referente al tema de archivos estamos a sus ordenes para apoyarles en lo que mas se pueda.

Código Fuente | GitHub en la carpeta ArchivosEnSD

¿Te gustó este post? ¡Compártelo!

Comparte este post

Acerca de: GustavoIvanVega

Arquitecto, analista y desarrollador con tecnologías .NET Difusor entusiasta de las TIC's en México. Fiel seguidor del proyecto Android en México

Sígueme en Twitter

Leer todos mis artículos

También puede interesarte

Comentarios de este artículo

  • Anonymous

    Hola me gustaría saber más sobre la creación de archivos, actualmente tengo un problema sobre este tema, estoy creando una aplicación la cual entre una de sus actividades sea posible tomar una foto y guardarla en la memoria SD del dispositivo, pero me gustaría clasificar las fotos a través de carpetas y sub carpetas.

    Por ejemplo, si tome una foto el día de hoy, quiero que la guarde en un carpeta que diga el año actual, que esta a su vez tenga una sub carpeta que diga el mes actual y que este tenga una sub carpeta que diga el dia actual.

    /2012 /Abril / 7/ foto.png

    y así cada vez que tome una foto la clasifique de acuerdo al año, mes y día.

    No se si esto pueda ser posible, me gustaría hacerlo de esa manera, he estado buscando en Internet y en otros recursos, pero casi no encuentro mucha información sobre este tema.

    Les agradecería si me pudieran ayudar con esta problemática que tengo o recibir una alternativa a este problema.

    • Anonymous

      Pues lo único que debes hacer es manejar la clase File de Java, de ahí pues dependerá de la distribución de tus carpetas según lo que me comentas y ya.

      En Android se utiliza de la misma forma que en Java la clase File.

      Saludos

  • Bal_lam

    Buenas tardes.

    Quiero guardar un archivo (fotografía) en la SD ¿que variable debo implementar en lugar de EditText? sería ¿ImageView?

  • Rigokc_87

    estoy aprendiendo sobre andriod y tengo una duda de un error en el while

    while ((charRead=isr.read(inputBuffer))&gt,0) {

    que no se puede convertir de entero a boleano &gt

    me podrian ayudar
    gracias

    • Jhodat Trejo

      YA SOLUCIONE EL PROBLEMA DEL WHILE >0..
      Lo que se tiene que hacer es sustituir > por >
      De este modo ya funciona.
      Lo que sucede es que el editor de la pagina al momento de copiar el código lo pasa así: > y no como en realidad es: >
      Espero les sirva.
      Buena vibra y Éxito.

  • Juanc Delgadosornes

    Buen día una pregunta funciona con una API menor a 10

  • Pepe6414

    Hola me agrado tu post muy bien explicado, solo una duda quiero descargar tu codigo pero el link esta roto, podrias arreglarlo para realizar la descarga

  • ChUsMa

    Muchisimas gracias, ha sido super útil, más que un curso que estoy haciendo…. GRACIAS!

  • Azael C

    hola yo tengo duda en :

    while ((charRead = isr.read(inputBuffer)) > 0)

    que es gt, como lo implemento o un equivalente ya mi maquina lo toma como error

  • jcgandroid

    Hola, Que puede pasar si despues de implementar todo los que poneis del proyecto, al pinchaar los botones, no hace nada? Ninguno de los dos botones…

    en el onClick del Button del activity.xml le he puesto a cada botón btnGuardar y btnAbrir, pero tampoco hacen nada… ¿alguna ocurrencia?

    • jcgandroid

      Ya me respondo yo mismo…. no habia puesto la linea en el manifest…

      Como se os ocurre hacer 4 o 5 ficheros? o un listado de las grabaciones de pantallas de texto???

      • http://www.facebook.com/eltrambia Juan Jose Sanchez

        Hola que tal jcgandroid, a que linea te refieres en el manifest…ya que tambien tengo el mismo problema, saludos.

  • Kitox021

    Buen día… Me aparece un error en:
    while ((charRead = isr.read(inputBuffer)) > 0)…

    En el gt, primero, me dice que se espera “/” en vez de “;” y después me dice que cree la variable “gt”… qué es gt?….

  • Jhodat Trejo

    Hola que tal a mi me marca un errro en el while de abrir donde dice > 0
    todo lo demas esta bien menos ese pequeño detalle

  • Jhodat Trejo

    YA SOLUCIONE EL PROBLEMA DEL WHILE >0..
    Lo que se tiene que hacer es sustituir > por >
    De este modo ya funciona.
    Lo que sucede es que el editor de la pagina al momento de copiar el código lo pasa así: > y no como en realidad es: >
    Espero les sirva.
    Buena vibra y Éxito.

  • Rey

    Hola, la creacion y la lectura funacionan muy bien, desde android, pero sabes como podría ver ese archivo creado, desde el explorador de windows? ya que no aparece.. De antemano gracias

  • Sergio Linares

    HOLA BUEN DIA, MI PREGUNTA ES , COMO SE GUARDARIA UNA IMAGEN EN LA SD?