如果你想摆脱缓存目录使用的尴尬:找不到目录?忘记申请读写权限?害怕污染用户存储空间?……请往下看
<强> SD卡缓存目录强>
当应用需要将图片或者文件缓存到SD卡中时要去申请创建目录,有下面几种途径
我们可以通过API调用应用专属目录:
///存储/模拟/0/Android/数据/app_package_name/文件/图片 Content.getExternalFilesDir (Environment.DIRECTORY_PICTURES);///存储/模拟/0/Android/数据/app_package_name/缓存 Content.getExternalCacheDir ();>之前上面两个目录是专属于当前应用的,当应用被删除时,上面目录下的文件也会清空
<强>内存缓存目录强>
相对于应用的专属SD卡缓存有两个内存缓存地址:
内容。getCacheDir ();///数据/数据/app_package_name/缓存 内容。getFilesDir ();///数据/数据/app_package_name/文件这两个目录中的文件也会随着应用程序的删除而清空
当系统版本大于等于4.4时,对通过上面4个API调用得到的目录进行文件的读写操作不需要申请SD卡的读写权限,所以6.0及以上系统使用时也不需要动态申请读写权限
<强>使用注意事项强>
当存储比较大的文件时,如图片等文件存储在SD卡对应的目录下
应用的内存缓存目录只有应用本身能对其进行读写操作,外部应用不行,如相机应用(内存目录读写权限:rwxr-x-x, SD卡缓存目录读写权限:rwxrwx)
即使是通过自定义路径得到的上述目录,在系统版本大于等于4.4时也不需要申请SD卡读写权限
<强> API使用及方法封装强>
/* * *获取应用专属缓存目录 * android 4.4及以上系统不需要申请SD卡读写权限 *因此也不用考虑6.0系统动态申请SD卡读写权限问题,切随应用被卸载后自动清空不会污染用户存储空间 * @param上下文上下文 * @param类型文件夹类型可以为空,为空则返回API得到的一级目录 * @return缓存文件夹如果没有SD卡或SD卡有问题则返回内存缓存目录,否则优先返回SD卡缓存目录 */公共静态文件getCacheDirectory(上下文语境,字符串类型){ 文件appCacheDir=getExternalCacheDirectory(背景、类型); 如果(appCacheDir==null) { appCacheDir=getInternalCacheDirectory(背景、类型); } 如果(appCacheDir==null) { 日志。e (“getCacheDirectory”、“getCacheDirectory失败,原因是手机未知异常!”); 其他}{ 如果(! appCacheDir.exists (),, ! appCacheDir.mkdirs ()) { 日志。e (“getCacheDirectory”、“getCacheDirectory失败,原因是使目录失败!”); } } 返回appCacheDir; }/* * *获取SD卡缓存目录 * @param上下文上下文 * @param类型文件夹类型如果为空则返回/存储/模拟/0/Android/数据/app_package_name/缓存 *否则返回对应类型的文件夹如环境。DIRECTORY_PICTURES对应的文件夹为…/数据/app_package_name/文件/图片 * {@link android.os.Environment # DIRECTORY_MUSIC}, * {@link android.os.Environment # DIRECTORY_PODCASTS}, * {@link android.os.Environment # DIRECTORY_RINGTONES}, * {@link android.os.Environment # DIRECTORY_ALARMS}, * {@link android.os.Environment # DIRECTORY_NOTIFICATIONS}, * {@link android.os。环境# DIRECTORY_PICTURES},或 * {@link android.os.Environment # DIRECTORY_MOVIES}。或自定义文件夹名称 * @return缓存目录文件夹或零(无SD卡或SD卡挂载失败) */公共静态文件getExternalCacheDirectory(上下文语境,字符串类型){ 文件appCacheDir=零; 如果(Environment.MEDIA_MOUNTED.equals (Environment.getExternalStorageState ())) { 如果(TextUtils.isEmpty(类型)){ appCacheDir=context.getExternalCacheDir (); 其他}{ appCacheDir=context.getExternalFilesDir(类型); } 如果(appCacheDir==null){//有些手机需要通过自定义目录 appCacheDir=新文件(Environment.getExternalStorageDirectory (),“Android/数据/? context.getPackageName() +缓存"//" +类型); } 如果(appCacheDir==null) { 日志。e (“getExternalDirectory”、“getExternalDirectory失败,原因是sdCard未知异常!”); 其他}{ 如果(! appCacheDir.exists (),, ! appCacheDir.mkdirs ()) { 日志。e (“getExternalDirectory”、“getExternalDirectory失败,原因是使目录失败!”); } } 其他}{ 日志。e (“getExternalDirectory”、“getExternalDirectory失败,原因是sdCard不存在或sdCard挂载失败!”); } 返回appCacheDir; }/* * *获取内存缓存目录 * @param类型子目录,可以为空,为空直接返回一级目录 * @return缓存目录文件夹或null(创建目录文件失败) *注:该方法获取的目录是能供当前应用自己使用,外部应用没有读写权限,如系统相机应用 */公共静态文件getInternalCacheDirectory(上下文语境,字符串类型){ 文件appCacheDir=零; 如果(TextUtils.isEmpty(类型)){ appCacheDir=context.getCacheDir();///数据/数据/app_package_name/缓存 其他}{ appCacheDir=新文件(context.getFilesDir(),类型);///数据/数据/app_package_name/文件/类型 } 如果(! appCacheDir.exists (),, ! appCacheDir.mkdirs ()) { 日志。e (“getInternalDirectory”、“getInternalDirectory失败,原因是使目录失败!”); } 返回appCacheDir; }获取Android应用专属缓存存储目录的实例