У меня есть простое приложение, которое обеспечивает доступ и запись данных на внешнее хранилище. Все работает нормально, пока я не перейду в Настройки -> Приложения -> Информация о приложении и не очистите данные с помощью кнопки «Очистить данные», , после чего каждый звонок до getExternalCacheDir()
начинает возвращать нуль.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 после очистки данных в настройках App 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()
возвращает «установлен». Кто-нибудь знает, что может быть неправильным?
EDIT
С помощью Gjordis я узнал, что Очистить данные кнопка удаляет целое приложение во временный каталог:
storage/sdcard0/Android/data/com.example.app/cache
в Android/data
, и я не смог создать он снова через getExternalCacheDir()
или вручную (хотя я могу создавать другие каталоги под storage/sdcard0/Android/data/
).
(Android/data/com.example.app
создается снова после перезагрузки устройства, но это не решение, которое я ищу)
Работает ли он после перезапуска вашего процесса (например, удалите приложение из списка недавних задач, а затем снова запустите приложение)? – CommonsWare
@CommonsWare: Я попытался остановить приложение и удалить его из запущенных служб, но без каких-либо успехов. Я еще не могу снова создать каталог кэша в Android/data. Единственный способ заставить его работать снова - перезагрузить устройство - см. Отредактированный вопрос. – Andy
Это похоже на ошибку. Увы, http://b.android.com сейчас не работает, поэтому я не могу подтвердить, подал ли кто-нибудь отчет об ошибке этого поведения. У вас есть полный проект, который служит в качестве воспроизводимого тестового примера, который вам может понравиться? (ZIP, указатель на репозиторий GitHub и т. Д.) – CommonsWare