Подтвердить что ты не робот

GetExternalCacheDir() возвращает значение null после очистки данных

У меня есть простое приложение, которое обеспечивает доступ и запись данных на внешнее хранилище. Все работает нормально, пока я не перейду в Настройки → Приложения → Информация о приложении и очистите данные с помощью кнопки "Очистить данные", то каждый вызов getExternalCacheDir() начинает возвращать null.

Я разрабатываю Nexus 7 под управлением Android 4.2.2.

Мой манифест выглядит так:

<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
...

Код, который не работает:

    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 после того, как приложение установлено и выполнено:

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 после очистки данных в настройках Info Info:

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

После очистки данных и выполнения приложения getExternalCacheDir() метод возвращает значение null, даже если Environment.getExternalStorageState() возвращает "смонтирован". Кто-нибудь знает, что может быть неправильным?

ИЗМЕНИТЬ

С помощью Gjordis я обнаружил, что кнопка Clear data удаляет весь временный каталог приложения:

storage/sdcard0/Android/data/com.example.app/cache в Android/data

и я не смог создать его снова через getExternalCacheDir() или вручную (хотя я могу создавать другие каталоги в storage/sdcard0/Android/data/).

(Android/data/com.example.app создается снова после перезагрузки устройства, но это не то решение, которое я ищу)

4b9b3361

Ответ 1

Я столкнулся и решил эту точную проблему.

Щелкнув по кнопке Очистить данные, Android перестает запускать приложение и удаляет всю папку приложения "mnt/sdcard/Android/data/your.package.name".

Однако у меня был отдельный процесс, который был запущен с Runtime.getRuntime().exec(), который был все еще запущен, и он писал эту папку. Это заставило папку застревать в заблокированном состоянии и вызвало тот же самый симптом, который вы описали, когда мое приложение называется getExternalCacheDir(). Запуск adb shell, а затем ls из папки /mnt/sdcard/Android/data показал, что папка была заблокирована процессом. Выполнение ps показало, что мой другой процесс все еще работает.

Решение состояло в том, чтобы должным образом убить другой процесс, который все еще записывался в папку приложения, зависящего от приложения, перед вызовом getExternalCacheDir().

Ответ 2

getExternalCacheDir() возвращает кеш файл, как указано в названии. Если кеш отсутствует, для него нет директории. Этот каталог используется для удаления временных файлов с помощью команды удаления данных. В тех случаях, когда телефон находится на низком уровне, он также может удалить эти папки. По крайней мере, некоторые приложения для обслуживания делают это.

getExternalFilesDir() возвращает каталог для сохранения, чтобы сохранить данные.

Ответ 3

Если вы используете getExternal * Cache * Dir(), он предназначен для хранения данных TEMPORALY, которые могут быть очищены системой. Если другим приложениям, расположенным спереди в задней части стола, нужны ресурсы, система может очищать ваши данные, потому что ресурсы системы нужны. если вы хотите сохранить свои данные настойчиво, используйте: File file = getExternalFilesDir (null); это внешняя память для хранения постоянных данных (например, виртуальная SD-карта).