java android caching android-external-storage

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.