java - getExternalCacheDir() devuelve nulo después de borrar los datos
android caching (3)
Tengo una aplicación simple que accede y escribe datos en un almacenamiento externo. Todo funciona bien hasta que voy a Configuración -> Aplicaciones -> Información de la aplicación y borro los datos a través del botón "Borrar datos", luego cada llamada a getExternalCacheDir()
comienza a regresar nula.
He estado desarrollando en Nexus 7 con Android 4.2.2.
Mi manifiesto se parece a:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.package"
android:versionCode="5"
android:versionName="1.3"
xmlns:tools="http://schemas.android.com/tools">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<application
...
Fragmento de código que no funciona:
Log.d(TAG, "getExternalStorageState() = " + Environment.getExternalStorageState());
Log.d(TAG, "getExternalCacheDir() = " + c.getExternalCacheDir());
Log.d(TAG, "getExternalFilesDir(null) = " + c.getExternalFilesDir(null));
Log.d(TAG, "getExternalFilesDir(Environment.DIRECTORY_MOVIES) = " + c.getExternalFilesDir(Environment.DIRECTORY_MOVIES));
LogCat después de que la aplicación se instale y ejecute:
05-15 11:26:45.948: DEBUG/HelperUtils(5541): getExternalStorageState() = mounted
05-15 11:26:45.948: DEBUG/HelperUtils(5541): getExternalCacheDir() = /storage/emulated/0/Android/data/com.example.package/cache
05-15 11:26:45.948: DEBUG/HelperUtils(5541): getExternalFilesDir(null) = /storage/emulated/0/Android/data/com.example.package/files
05-15 11:26:45.948: DEBUG/HelperUtils(5541): getExternalFilesDir(Environment.DIRECTORY_MOVIES) = /storage/emulated/0/Android/data/com.example.package/files/Movies
LogCat después de borrar los datos en la configuración de información de la aplicación:
05-15 11:27:57.848: DEBUG/HelperUtils(5859): getExternalStorageState() = mounted
05-15 11:27:57.848: WARN/ContextImpl(5859): Unable to create external cache directory
05-15 11:27:57.848: DEBUG/HelperUtils(5859): getExternalCacheDir() = null
05-15 11:27:57.848: WARN/ContextImpl(5859): Unable to create external files directory
05-15 11:27:57.848: DEBUG/HelperUtils(5859): getExternalFilesDir(null) = null
05-15 11:27:57.848: WARN/ContextImpl(5859): Unable to create external files directory
05-15 11:27:57.848: DEBUG/HelperUtils(5859): getExternalFilesDir(Environment.DIRECTORY_MOVIES) = null
05-15 11:27:57.848: WARN/ContextImpl(5859): Unable to create external cache directory
Después de borrar los datos y ejecutar la aplicación, el método getExternalCacheDir()
devuelve un valor nulo a pesar de que Environment.getExternalStorageState()
devuelve "mount". ¿Alguien sabe qué podría estar mal?
EDITAR
Con la ayuda de Gjordis, descubrí que el botón Borrar datos elimina todo el directorio temporal de la aplicación:
storage/sdcard0/Android/data/com.example.app/cache
en Android/data
y no pude volver a crearlo a través de getExternalCacheDir()
o manualmente (aunque puedo crear otros directorios en storage/sdcard0/Android/data/
).
( Android/data/com.example.app
se crea de nuevo después de reiniciar el dispositivo, pero esa no es la solución que estoy buscando)
He encontrado y resuelto este problema exacto.
Al hacer clic en el botón Borrar datos, Android detiene la ejecución de su aplicación y elimina toda la carpeta específica de la aplicación "mnt/sdcard/Android/data/your.package.name"
.
Sin embargo, tuve un proceso separado que se inició desde Runtime.getRuntime().exec()
que aún se estaba ejecutando y estaba escribiendo en esta carpeta. Esto hizo que la carpeta se atascara en un estado bloqueado y causó el mismo síntoma que describió cuando mi aplicación llamó a getExternalCacheDir()
. La ejecución de adb shell
y luego ls
desde la carpeta / mnt / sdcard / Android / data mostró que la carpeta estaba bloqueada por un proceso. La ejecución de ps
demostró que mi otro proceso todavía estaba en ejecución.
La solución fue eliminar correctamente el otro proceso que aún estaba escribiendo en la carpeta específica de la aplicación de mi aplicación antes de llamar a getExternalCacheDir()
.
Si usa getExternal * Cache * Dir (), es para almacenar TEMPORALMENTE datos que el sistema puede limpiar. Si otras aplicaciones en la parte de atrás del backstack necesitan recursos, el sistema puede limpiar sus datos porque el sistema necesita recursos. si desea guardar sus datos de forma persistente, utilice: Archivo de archivo = getExternalFilesDir (null); esta es una memoria externa para el almacenamiento de datos permanentes (como una tarjeta de memoria virtual).
getExternalCacheDir()
devuelve el directorio de caché como dice el nombre. Si no hay caché, tampoco hay un directorio para ello. Este directorio se utiliza para los archivos temporales que eliminó con el comando eliminar datos. En los casos en que el teléfono tenga poco espacio, también puede eliminar estas carpetas. Al menos algunas aplicaciones de mantenimiento lo hacen.
getExternalFilesDir()
devuelve el directorio para espacio para guardar datos.