清除数据后,getExternalCacheDir()返回null

我有一个简单的应用程序,访问和写入数据到外部存储。 一切正常,直到我去设置 – >应用程序 – >应用程序信息和通过“清除数据”button清除数据,然后每次调用getExternalCacheDir()开始返回null。

我一直在开发运行Android 4.2.2的Nexus 7。

我的清单看起来像:

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

 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()返回“mounted”。 有谁知道什么可能是错的?

编辑

在Gjordis的帮助下,我发现清除数据button会删除整个应用程序临时目录:

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

我无法通过getExternalCacheDir()或手动(尽pipe我可以在storage/sdcard0/Android/data/下创build其他目录getExternalCacheDir()来创build它。

Android/data/com.example.app是在设备重启后重新创build的,但这不是我正在寻找的解决scheme)

Solutions Collecting From Web of "清除数据后,getExternalCacheDir()返回null"

我遇到并解决了这个确切的问题。 点击清除数据button会导致Android停止运行,并删除整个应用程序专用文件夹“mnt / sdcard / Android / data / your.package.name”。 但是,我有一个从Runtime.getRuntime().exec()开始的独立进程,它仍在运行,正在写入这个文件夹。 这导致文件夹被locking在locking状态,导致您在描述我的应用程序调用getExternalCacheDir()时出现的相同症状。 运行adb shell ,然后在/ mnt / sdcard / Android / data文件夹中inputls ,表明该文件夹被进程locking。 运行ps显示我的其他进程仍在运行。

解决scheme是在调用getExternalCacheDir()之前,正确地杀死仍在写入我的应用程序的特定于应用程序的文件夹的其他进程。

getExternalCacheDir()像名称所示那样返回caching目录。 如果没有caching,则没有目录。 该目录用于使用remove data命令删除的临时文件。 在电话空间不足的情况下,它也可以自行删除这些文件夹。 至less有一些维护应用程序这样做。

getExternalFilesDir()返回空间的目录来保存数据。

如果使用getExternal * Cache * Dir(),则它是为了存储可由系统清理的TEMPORALY数据。 如果在后台的其他应用程序需要资源,系统可以清理您的数据,因为系统需要资源。 如果要永久保存数据,请使用:File file = getExternalFilesDir(null); 这是存储持久数据的外部存储器(如虚拟SD卡)。