getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()的作用

本文介绍了Android应用在运行过程中如何管理数据存储,包括使用Context.getExternalFilesDir()和Context.getExternalCacheDir()方法获取SDCard上的特定目录,以及如何通过这些方法避免应用卸载后遗留垃圾数据的问题。此外,文章还提供了获取缓存地址的方法,并讨论了如何正确地存储下载内容以避免误删。

getCacheDir()方法用于获取/data/data/<application package>/cache目录

getFilesDir()方法用于获取/data/data/<application package>/files目录

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。
大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。
这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据。
如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢?

通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据

如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。

而且上面二个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项


如果要保存下载的内容,就不要放在以上目录下


-----------------------------------------------------------------------------------------------------------------------------------------------------

较优秀的程序都会专门写一个方法来获取缓存地址,如下所示:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public String getDiskCacheDir(Context context) {  
  2.     String cachePath = null;  
  3.     if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())  
  4.             || !Environment.isExternalStorageRemovable()) {  
  5.         cachePath = context.getExternalCacheDir().getPath();  
  6.     } else {  
  7.         cachePath = context.getCacheDir().getPath();  
  8.     }  
  9.     return cachePath;  
  10. }  
可以看到,当SD卡存在或者SD卡不可被移除的时候,就调用getExternalCacheDir()方法来获取缓存路径,否则就调用getCacheDir()方法来获取缓存路径。前者获取到的就是 /sdcard/Android/data/<application package>/cache 这个路径,而后者获取到的是 /data/data/<application package>/cache 这个路径。



参考:http://blog.youkuaiyun.com/beihai1212/article/details/7055899

http://blog.youkuaiyun.com/zhiyi2010/article/details/13017171

http://blog.youkuaiyun.com/guolin_blog/article/details/28863651


转载自:http://blog.youkuaiyun.com/u011494050/article/details/39671159

<think>好的,我现在需要帮助用户解决在安卓开发中获取应用目录路径的问题,并提供示例代码。首先,我要回忆一下之前用户提到的引用内容,虽然那些引用可能不完全相关,但可能有帮助。 用户的问题很明确,他们需要具体的解决方案和代码示例。我记得在Android中,应用目录分为内部存储和外部存储,还有可能涉及缓存目录或者APK路径。首先,内部存储路径通常通过Context的方法获取,比如getFilesDir()getCacheDir()。外部存储则需要使用Environment.getExternalStorage...相关的方法,但需要注意权限和API版本的变化。 根据引用[1]和[2],用户已经提到过内部存储路径的获取方法,比如context.getFilesDir().getAbsolutePath(),这可能是一个关键点。而引用[3]提到APK路径在/data/app/下,但访问受限,可能需要PackageManager来获取。 接下来,我需要整理常见的几种应用目录路径,并给出对应的代码示例。需要注意不同路径的获取方式以及所需的权限。比如,内部存储不需要权限,而外部存储可能需要READ_EXTERNAL_STORAGE权限,特别是在较新的Android版本中。 另外,用户可能需要了解这些路径的区别和使用场景。例如,内部存储是应用私有的,外部存储可能分为私有目录和公共目录,公共目录需要权限,而私有目录在Android 4.4及以上不需要权限。 还需要考虑代码的兼容性,比如使用ContextCompat.getExternalFilesDirs()来获取外部存储的路径,包括可能存在的SD卡路径。同时,对于缓存目录getCacheDir()getExternalCacheDir()的区别也需要说明。 最后,关于APK路径,虽然用户没有明确提到,但引用[3]提到使用PackageManager,所以可能需要包括如何通过PackageManager获取应用信息,进而得到APK路径,但需要注意权限问题,比如需要REQUEST_INSTALL_PACKAGES权限。 现在需要把这些信息结构化,分点说明,并给出对应的代码示例。确保代码正确,使用中文注释,并提醒用户注意权限和API版本差异。可能还需要在注意事项中提到存储访问框架(SAF)或者Scoped Storage的影响,特别是在Android 10及以上版本。 总结步骤: 1. 内部存储目录getFilesDir()getCacheDir() 2. 外部私有目录getExternalFilesDir()getExternalCacheDir() 3. 公共存储目录:Environment.getExternalStoragePublicDirectory()(已过时,需注意) 4. APK安装路径:通过PackageManager获取ApplicationInfo的sourceDir 5. 提醒权限和版本差异 6. 提供完整示例代码,并解释各部分的作用 需要检查是否有遗漏的路径,比如应用的数据库路径或者其他特殊目录。同时,确保代码示例中的方法都是当前推荐使用的,避免使用已弃用的API。 可能还需要提到Context的方法,如getDataDir()获取应用的数据目录,这在API 24+可用。不过对于兼容性,需要判断版本或使用其他方法。 现在将这些内容整理成清晰的部分,每部分说明用途、代码示例和注意事项,最后汇总一个完整的示例,并附上相关问题。</think>### 安卓应用目录路径获取方法及代码示例 #### 一、内部存储路径 1. **私有文件目录** - **用途**:存储应用私有文件,其他应用无法直接访问 - **代码**: ```java String filesPath = getApplicationContext().getFilesDir().getAbsolutePath(); // 示例输出:/data/user/0/包名/files ``` 2. **缓存目录** - **用途**:存储临时缓存文件,系统可能自动清理 - **代码**: ```java String cachePath = getApplicationContext().getCacheDir().getAbsolutePath(); // 示例输出:/data/user/0/包名/cache ``` --- #### 二、外部存储路径 1. **外部私有目录** - **用途**:应用专属的外部存储目录,Android 4.4+ 无需权限 - **代码**: ```java // 获取主外部存储路径 File externalFilesDir = getApplicationContext().getExternalFilesDir(null); String externalPath = externalFilesDir.getAbsolutePath(); // 示例输出:/storage/emulated/0/Android/data/包名/files // 获取外部缓存目录 File externalCacheDir = getApplicationContext().getExternalCacheDir(); String externalCachePath = externalCacheDir.getAbsolutePath(); ``` 2. **公共目录**(需权限) - **用途**:访问系统公共目录(如Downloads、DCIM) - **代码**(API ≤ 28): ```java File publicDownloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); // 需添加权限:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ``` --- #### 三、APK安装路径 - **用途**:获取当前应用的APK文件路径 - **代码**: ```java try { String apkPath = getPackageManager().getApplicationInfo(getPackageName(), 0).sourceDir; // 示例输出:/data/app/包名/base.apk } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } ``` --- #### 四、完整示例代码 ```java // 内部存储路径 String internalFilesPath = getFilesDir().getAbsolutePath(); String internalCachePath = getCacheDir().getAbsolutePath(); // 外部存储路径 File externalFilesDir = getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS); String externalFilesPath = externalFilesDir != null ? externalFilesDir.getPath() : "不可用"; // 获取APK路径 String apkPath; try { apkPath = getPackageManager().getApplicationInfo(getPackageName(), 0).sourceDir; } catch (Exception e) { apkPath = "获取失败"; } // 打印结果 Log.d("PathInfo", "内部文件路径:" + internalFilesPath + "\n" + "内部缓存路径:" + internalCachePath + "\n" + "外部文档路径:" + externalFilesPath + "\n" + "APK路径:" + apkPath); ``` --- #### 注意事项 1. **权限声明**: ```xml <!-- 访问外部公共目录需要声明权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ``` 2. **API兼容性**: - `Environment.getExternalStoragePublicDirectory()` 在Android 10(API 29)后已废弃,建议改用[MediaStore API](https://developer.android.com/training/data-storage/shared/media)或[存储访问框架](https://developer.android.com/guide/topics/providers/document-provider) 3. **多用户环境**: 使用`ContextCompat.getExternalFilesDirs()`可获取所有外部存储设备路径(包括SD卡) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值