获取Android应用专属缓存存储目录的实例

  

如果你想摆脱缓存目录使用的尴尬:找不到目录?忘记申请读写权限?害怕污染用户存储空间?……请往下看

  

<强> 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应用专属缓存存储目录的实例