Una descripción general del almacenamiento de Android

El almacenamiento es algo de lo que todos somos conscientes, pero que siempre damos por sentado. No hace mucho, cada salto en la capacidad de almacenamiento era incremental y parecía imposible. Hoy en día, no pensamos dos veces cuando contemplamos cuánto tienen nuestros dispositivos (y no nos importan menos las diferencias).

Un punto más importante sería observar la evolución de lo que se almacena en la memoria. Antes de los teléfonos inteligentes, guardábamos una o dos fotos ocasionales, algunos juegos y un montón de mensajes de texto. Pero ahora, cualquier teléfono estándar tendrá una combinación de aplicaciones, documentos, fotos, videos, archivos de música y más. Averigüemos cómo podemos utilizar el espacio de almacenamiento de un dispositivo para nuestras aplicaciones.

Lo que vamos a cubrir en este artículo es:

  1. Los diferentes tipos de almacenamiento en teléfonos Android
  2. Diferencias entre los tipos de almacenamiento
  3. Cómo utilizar el almacenamiento en su aplicación

Cada aplicación tiene acceso a dos tipos diferentes de almacenamiento: interno y externo . Existen grandes diferencias entre estos dos tipos de almacenamiento, y conocerlos le ayudará a diseñar su próxima aplicación.

Antes de comenzar, se debe decir una cosa sobre el almacenamiento y la caché. El almacenamiento está destinado a las cosas que desea guardar de forma persistente, mientras que el caché está ahí para guardar cosas temporalmente.

Día de la mudanza

Almacenamiento interno

Cuando cada aplicación se ejecuta en el sistema operativo, tiene su propio almacenamiento interno. Este almacenamiento es privado y solo para uso de la aplicación. Es decir, otras aplicaciones no pueden acceder ni el usuario. Otra cosa a tener en cuenta al utilizar el almacenamiento interno es la disponibilidad del mismo. A diferencia del almacenamiento externo, el almacenamiento interno siempre está disponible para su aplicación.

Sin embargo, el uso de este almacenamiento tiene sus inconvenientes. Si el usuario elimina la aplicación, también se eliminan todos los datos almacenados en el almacenamiento interno de la aplicación. Imagínese lo que sucedería si instalara un juego en su teléfono y en algún lugar decidiera eliminarlo. Le gustaría que se guardara el progreso del juego, si por casualidad instalara el juego nuevamente.

Entonces, ¿cómo guardamos un archivo en el almacenamiento interno?

public void saveFileInternalStorage() { String FILENAME = "hello_world_file"; String inputToFile = "Hello From Internal Storage!"; try { FileOutputStream fileOutputStream = openFileOutput(FILENAME, Context.MODE_PRIVATE); fileOutputStream.write(inputToFile.getBytes()); fileOutputStream.close(); Toast.makeText(getApplicationContext(), "File " + FILENAME + " has been saved successfully", Toast.LENGTH_SHORT).show(); } catch (FileNotFoundException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "File " + FILENAME + " has not been saved successfully due to an exception " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "File " + FILENAME + " has not been saved successfully due to an exception " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); } }

Como puede ver en el ejemplo de código, estamos guardando un archivo llamado hello_world_file que contiene el texto "¡Hola desde el almacenamiento interno!" . He creado dos cláusulas de captura solo para demostrar las excepciones que pueden ocurrir al intentar hacer esto, pero puede minimizarlas a una cláusula de captura con el objeto de excepción general.

Preste atención a que el método openFileOutput abrirá el archivo si ya existe, pero si no, lo creará. El segundo parámetro de este método es el modo de archivo. Este parámetro designa el alcance del archivo y el acceso a él. El valor predeterminado es MODE_PRIVATE, que hace que el archivo sea accesible solo para su aplicación.

Los otros dos valores para este parámetro son MODE_WORLD_READABLE y MODE_WORLD_WRITEABLE, pero han quedado en desuso desde API 17. Compartir archivos privados con otras aplicaciones utiliza un conjunto diferente de lógica sobre el que puede leer más aquí. Finalmente, al escribir en el archivo, convertimos nuestra cadena a bytes y nos aseguramos de cerrar el archivo al final.

Disco duro roto - Copia de seguridad de almacenamiento

Almacenamiento externo

Al contrario de lo que implica el nombre, se trata de un almacenamiento que se define por el hecho de que no siempre es accesible. Esto puede significar que puede ser una tarjeta SD externa (almacenamiento externo secundario), pero también se puede encontrar en el dispositivo (almacenamiento externo primario).

Para llevar el hecho a casa, el almacenamiento externo es un almacenamiento al que se puede acceder cuando conecta su dispositivo a una computadora a través de un cable USB. Como habrás adivinado, cualquier cosa almacenada en este tipo de almacenamiento es accesible para otras aplicaciones en tu dispositivo, pero se mantendrá si desinstalas la aplicación.

Antes de que podamos demostrar cómo guardar archivos en el almacenamiento externo, debemos hacer dos cosas:

  1. Asegúrese de que haya suficiente espacio allí para guardar el archivo
  2. Pide permiso durante el tiempo de ejecución

Asegurarse de que haya suficiente espacio de almacenamiento requiere las siguientes líneas de código:

//Check if you can read/write to external storage public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; }

Para obtener acceso al almacenamiento externo, debemos agregar el siguiente permiso a nuestro AndroidManifest.xml:

Además, desde API 23, los permisos peligrosos no se autorizan durante el tiempo de instalación, sino durante el tiempo de ejecución. Escribir en almacenamiento externo se clasifica como uno, por lo que debemos agregar lógica para permitir que el usuario decida si concede o no permiso a la aplicación.

public void saveFileExternalStorage(View view) { if (isExternalStorageWritable()) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { writeFileToExternalStorage(); } else{ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); } } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 0: { writeFileToExternalStorage(); break; } } }

Nuestro writeFileToExternalStorage se ve así:

public void writeFileToExternalStorage() { String root = Environment.getExternalStorageDirectory().toString(); File myDir = new File(root + "/saved_files"); if (!myDir.exists()) { myDir.mkdirs(); } try { File file = new File(myDir, "myfile.txt"); FileOutputStream out = new FileOutputStream(file); out.write(inputToFile.getBytes()); out.close(); Toast.makeText(getApplicationContext(), "File myfile.txt" + " has been saved successfully to external storage", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); } }

Si desea ver un ejemplo de todo el código presentado aquí, puede dirigirse a este repositorio de GitHub.

Nueve ocho siete

Bueno saber

Los anteriores fueron solo dos ejemplos simples de cómo trabajar con los diferentes tipos de almacenamiento para su aplicación. Dado que estamos tratando con un recurso que administra el sistema, también debemos ser conscientes de los comportamientos asociados a él.

De forma predeterminada, su aplicación se instalará en el almacenamiento interno ( consulte la explicación de internalOnly ), pero desde el nivel de API 8, puede agregar un atributo, installLocation , a su manifiesto que permite que su aplicación se instale en el almacenamiento externo. Una razón para hacerlo es si su aplicación es muy grande y prefiere que el usuario la instale en el almacenamiento externo del dispositivo, ya que hay más espacio allí.

Hay tres valores para este atributo:

  • auto : significa que no tiene una preferencia específica donde se instalará la aplicación. La aplicación intentará instalarse en el almacenamiento interno, pero si está llena, la instalará dentro del almacenamiento externo.
  • internalOnly - the application will only be installed to internal storage, and if there isn’t enough space there, it will not be installed
  • preferExternal - means that you want your application to be installed to external storage, but if there is not enough room there, it will be installed internally

For both the auto and the preferExternal options, the user has the option of moving the application from external storage to internal, and vice versa.

Keep in mind that once a user connects their device to a computer and enables it to share data or unmounts an SD card, all applications running from the external storage are destroyed. If your application uses one of the following features, you should not install it to external storage:

Varios servicios (servicio de alarma s , en particular), Motores de métodos de entrada, Fondos de pantalla animados, elementos de aplicación, gestores de cuentas, Sync adaptadores, Administradores de dispositivos y receptores de radiodifusión escucha de arranque completado.