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

我有一个简单的应用程序,可以访问数据并将其写入外部存储。一切正常,直到我转到设置 - >应用程序 - >应用程序信息并通过“清除数据”按钮清除数据,然后每次调用开始返回空值。getExternalCacheDir()

我一直在运行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

清除数据并执行应用方法后,即使返回“已装载”,也会返回 null。有谁知道可能出了什么问题?getExternalCacheDir()Environment.getExternalStorageState()

编辑

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

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

并且我无法通过或手动再次创建它(尽管我能够在 下创建其他目录)。getExternalCacheDir()storage/sdcard0/Android/data/

(Android/data/com.example.app在设备重新启动后再次创建,但这不是我正在寻找的解决方案)


答案 1

我遇到并解决了这个确切的问题。

单击“清除数据”按钮会导致 Android 停止运行您的应用程序并删除整个特定于应用程序的文件夹。"mnt/sdcard/Android/data/your.package.name"

但是,我有一个单独的进程,该进程从中启动,该进程仍在运行,并且正在写入此文件夹。这导致文件夹卡在锁定状态,并导致我的应用调用 时描述的相同症状。运行,然后从 /mnt/sdcard/Android/data 文件夹中显示该文件夹被进程锁定。“正在运行”显示我的其他进程仍在运行。Runtime.getRuntime().exec()getExternalCacheDir()adb shelllsps

解决方案是在调用 之前正确终止仍在写入应用程序的应用程序特定文件夹的其他进程。getExternalCacheDir()


答案 2

getExternalCacheDir()返回缓存目录,如名称所示。如果没有缓存,则也没有它的目录。此目录用于使用“删除数据”命令删除的临时文件。在手机空间不足的情况下,它也可以自己删除这些文件夹。至少一些维护应用程序会这样做。

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