android storage

android - `/ storage/emulated/legacy/` vs `/ storage/emulated/0/` vs `data/data/myApp ''



(1)

Quiero guardar en mi aplicación un archivo de imagen

Quiero que "la aplicación de Google cropper" lo use.

Pero luego se abre otra imagen.

Supongo que es cuestión de permisos.

En mi código guardo aquí:

¿Es este almacenamiento externo? Environment.getExternalStorageDirectory().getAbsolutePath() que devuelve: /storage/emulated/0/myApp/file1.tmp

usando adb shell es ver que el archivo está realmente guardado en: /storage/emulated/legacy/myApp/file1.tmp

por que es la diferencia

¿Debo usar este lugar en su lugar? ¿Es este almacenamiento externo?

getAppContext().getFilesDir().getParent() que devuelve: `data / data / myApp ''


Históricamente, la diferencia entre el almacenamiento interno y externo fue la siguiente ...

Interno: el almacenamiento flash interno de un dispositivo Android utilizado para asignar almacenamiento privado para cada aplicación. El almacenamiento asignado está protegido para evitar el acceso de cualquier otra aplicación (excepto en dispositivos rooteados).

Externo: en muchos casos, una tarjeta SD sin restricciones de seguridad, es decir, todas las aplicaciones pueden acceder a todas las áreas de almacenamiento "externo".

A medida que aparecen nuevas versiones de Android y que los dispositivos tienen cada vez más almacenamiento flash interno, la diferencia entre lo interno y lo externo se está borrando. Por ejemplo, mi Nexus 7 no tiene una ranura para tarjeta SD.

En el caso de dispositivos sin verdadero almacenamiento externo, aún es necesario que Android proporcione un almacenamiento externo emulado para seguir siendo compatible con las aplicaciones más antiguas. En otras palabras, la RAM es físicamente interna (no extraíble), pero una parte de ella está particionada y las API del sistema de archivos de Android consideran que la partición es "externa" y legible para todo el mundo.

En cuanto a las rutas que se ven para el almacenamiento externo, como ...

/storage/emulated/0/myApp/file1.tmp /storage/emulated/legacy/myApp/file1.tmp

... uno u otro de esos (posiblemente ambos) es una redirección o ruta "virtual" a la misma parte del directorio y archivo externo emulado.

Es por esto que es esencial usar siempre la llamada a la API correcta para obtener acceso a los archivos y directorios en lugar de asumir una ruta codificada, ya que puede variar de un dispositivo a otro.

Si usa Environment.getExternalStorageDirectory() , puede estar seguro de que cualquier otra aplicación que haga lo mismo podrá acceder a cualquier archivo que cree allí.

Si usa getFilesDir() entonces está accediendo a la raíz del almacenamiento interno asignado de forma privada a su aplicación y accesible solo a su aplicación (aunque, como mencioné, un teléfono rooteado puede acceder al almacenamiento privado / interno).