19

我有一个简单的应用程序可以访问并将数据写入外部存储。一切正常,直到我转到“设置”->“应用程序”->“应用程序信息”并通过“清除数据”按钮清除数据,然后每次调用都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

清除 App Info 设置中的数据后的 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

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

编辑

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

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

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

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

4

3 回答 3

11

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

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

但是,我有一个单独的进程从它开始,Runtime.getRuntime().exec()它仍在运行,它正在写入这个文件夹。这导致文件夹卡在锁定状态,并导致您在我的应用程序调用时描述的相同症状getExternalCacheDir()。运行adb shell然后ls从 /mnt/sdcard/Android/data 文件夹中显示该文件夹已被进程锁定。运行ps表明我的其他进程仍在运行。

解决方案是在调用getExternalCacheDir().

于 2014-08-20T14:54:21.557 回答
6

getExternalCacheDir()像名字所说的那样返回缓存目录。如果没有缓存,则也没有目录。此目录用于存放您使用 remove data 命令删除的临时文件。如果手机空间不足,它也可以自行删除这些文件夹。至少一些维护应用程序会这样做。

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

于 2013-05-15T10:06:37.807 回答
-3

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

于 2013-05-15T10:24:36.663 回答