我有一个简单的应用程序,可以访问和写入外部存储的数据。一切正常,直到我去设置 - >应用 - >应用信息和清除数据通过"清除数据"按钮,
然后每次调用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
清除数据并执行app getExternalCacheDir()
方法后,即使Environment.getExternalStorageState()
返回&#34;已挂载&#34;,也会返回null。有谁知道可能出现什么问题?
修改
在Gjordis的帮助下,我发现清除数据按钮删除了整个应用程序的临时目录:
storage/sdcard0/Android/data/com.example.app/cache
中的 Android/data
我无法通过getExternalCacheDir()
或手动创建它(虽然我可以在storage/sdcard0/Android/data/
下创建其他目录。)
(设备重启后再次创建Android/data/com.example.app
,但这不是我要找的解决方案)
答案 0 :(得分:11)
我遇到并解决了这个确切的问题。
点击清除数据按钮会导致Android阻止您的应用运行,并删除整个特定于应用程序的文件夹"mnt/sdcard/Android/data/your.package.name"
。
但是,我有一个单独的进程,它从Runtime.getRuntime().exec()
开始,仍在运行,并且正在写入此文件夹。这导致文件夹卡在锁定状态,并导致我的应用程序调用{{1}}时描述的相同症状。从/ mnt / sdcard / Android / data文件夹中运行getExternalCacheDir()
然后adb shell
表明该文件夹已被进程锁定。运行ls
表明我的其他进程仍在运行。
解决方法是在调用ps
之前正确杀死仍在写入应用程序特定于应用程序的文件夹的其他进程。
答案 1 :(得分:6)
getExternalCacheDir()
返回缓存目录,如名称所示。如果没有缓存,则也没有目录。此目录用于使用remove data命令删除的临时文件。如果手机空间不足,它也可以自行删除这些文件夹。至少有一些维护应用程序会这样做。
getExternalFilesDir()
返回空间目录以保存数据。
答案 2 :(得分:-3)
如果使用getExternal * Cache * Dir(),则为了存储可由系统清理的 TEMPORALY 数据。 如果backstack前面的其他应用程序需要资源,系统可以清理您的数据,因为系统需要资源。 如果要持久保存数据,请使用:File file = getExternalFilesDir(null); 这是存储持久数据的外部存储器(如虚拟SD卡)。