Android笔记:存储相关,getExternalCacheDir, getExternalFilesDir,getExternalStorageDirectory等

File cacheDir = mContext.getExternalCacheDir();
if(null != cacheDir){
   mCacheDirPath = cacheDir.getAbsolutePath() + "/images/";
}

if(TextUtils.isEmpty(mCacheDirPath)){
   if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
      mCacheDirPath = Environment.getExternalStorageDirectory().getPath() + "/Android/data/com.meiyaapp.meiya/cache/images/";
   }else{
      Toast.makeText(mContext,"SD卡状态错误,请调整后重试哦。",Toast.LENGTH_SHORT).show();
   }
}

参考文章:http://my.oschina.net/liucundong/blog/314520

Android应用正确使用扩展SD卡

先介绍一下Android的存储

在 2.x 版本中,Android设备都是单存储,第三方App写文件,必须申请 WRITE_EXTERNAL_STORAGE 权限;

在4.0之后,Android设备开始有了内置闪存,即 primary storage,并且可以外置SD卡,即 secondary external storage device;

WRITE_EXTERNAL_STORAGE 权限变成了仅仅控制 primary storage,同时引入了 WRITE_MEDIA_STORAGE 权限来控制secondary external storage device的操作。

到了Android 4.4 KitKat,WRITE_MEDIA_STORAGE 权限仅提供给系统应用,不再授予第三方App。

关于 secondary external storage device 的写操作也有了新规定。

Android的文档是这么写的:

Link: http://source.android.com/devices/tech/storage/index.html:

The WRITE_EXTERNAL_STORAGE permission must only grant write access to 
the primary external storage on a device. Apps must not be allowed to 
write to secondary external storage devices, except in their 
package-specific directories as allowed by synthesized permissions. 
Restricting writes in this way ensures the system can clean up files 
when applications are uninstalled.

翻译: 
WRITE_EXTERNAL_STORAGE 权限,仅仅用于授权用户写 primary external storage,除了与自己包名相关的文件夹之外,应用程序不允许写secondary external storage devices。

举例来说,如果应用的包名是com.example.foo,那么外部存储上的Android/data/com.example.foo/文件夹就可随意访问,其他任何地方都不允许写,并且,存储在自己包名相关的文件夹的文件,当该应用被卸载时候也会随之被清除。

分情况来说:

  • 只有外部存储的设备 
    这种设备一般是android4.0之前的,只有一个存储,不受这个规则限制,还是可以随便读写,但如果你刷了4.4系统,那么就只能写自己包名相关的文件夹了。
  • 只有内部存储的设备 
    比如Nexus系列,sony L系列,不受这个规则限制,但是建议在自己的包名相关的文件夹写数据。
  • 既有内部存储又有外部存储 
    需要遵守这个规定,不能在外部存储乱写了,需要在自己的包名相关的文件夹写数据。

Google做了这个限制后解决了这个问题:

随便一个App,都会在/sdcard、/sdcard1 上建一个目录,删了也会重新建,即使被卸载,也会留下一些垃圾文件。

但是,也产生了一个问题:

类似于视频、图像处理这种想在外部存储缓存大量音视频文件,并且App被卸载后还想保留的,就没办法了。

开发中应该怎么使用?

作为一个程序员,想必你也很讨厌App在SD卡根目录乱建目录吧,那就从我做起,来遵守Google的这一规定吧。

通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/{package_name}/files/ ,储存一些长时间保存的数据;

通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/{package_name}/cache/,储存临时缓存数据;

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

一个获取外部存储Cache的例子:

/**

  * 获取拓展存储Cache的绝对路径  *  * @param context  */
 public static String getExternalCacheDir(Context context) {      if (!isMounted())           return null;

      StringBuilder sb = new StringBuilder();      File file = context.getExternalCacheDir();      // In some case, even the sd card is mounted,
      // getExternalCacheDir will return null
      // may be it is nearly full.

      if (file != null) {
           sb.append(file.getAbsolutePath()).append(File.separator);
      } else {
           sb.append(Environment.getExternalStorageDirectory().getPath()).append("/Android/data/").append(context.getPackageName())
                     .append("/cache/").append(File.separator).toString();
      }      return sb.toString();
 }

参考: 
https://plus.google.com/+TodLiebeck/posts/gjnmuaDM8sn 
http://blog.csdn.net/olevin/article/details/29575127 
http://source.android.com/devices/tech/storage/index.html

时间: 2024-10-13 05:59:24

Android笔记:存储相关,getExternalCacheDir, getExternalFilesDir,getExternalStorageDirectory等的相关文章

Android 内部存储相关的函数(getCacheDir,getDir, getFileStreamPath,getFilesDir,openFileInput, ...)

为了保证应用程序存储数据的安全性,开发者在开发应用程序的过程中需要注意使用Android 应用程序的内部存储空间. 根据不同的要求,将对应的数据文件.缓存文件.临时文件等分别存储在相应的位置. 注意:存储在SDCard 上的文件,将对任何Android 应用程序可见,并具有存取权限.因此,仅仅是应用程序自己使用,的临时文件也不要存储到SDCard上. 应用程序内部存储相关函数,请参考Android 官方网站, 下文对几个重要函数做了中文介绍: 出处:http://blog.csdn.net/hu

android 内部存储相关知识点: getfilestreampath getDir 子文件夹

文件系统的API的命名方式和常规的不一样: 都是get命名,但是功能就是能创建文件夹...   这种方式的API 命名习惯和常规的不一样...  createXXX ----方便查找 http://ipjmc.iteye.com/blog/1447097 http://blog.csdn.net/hudashi/article/details/8037076

Android在线升级相关笔记一(解析服务器版本与当前版本比较)

大概流程:Android客户端去访问服务器上的封装了版本号等信息的xml文件,对服务器上的版本和当前版本进行比较, 如果低于服务器的版本,则下载服务器上的新版软件,进行安装替换,完成升级. 一.首先用tomcat搭建服务器,用于开发测试. 下载tomcat请参考:http://blog.csdn.net/only_tan/article/details/25110625 1.在tomcat中新建自己的项目: \apache-tomcat-6.0.39\webapps 目录下新建自己的项目文件夹,

Android笔记——Android中数据的存储方式(三)

Android系统集成了一个轻量级的数据库:SQLite,所以Android对数据库的支持很好,每个应用都可以方便的使用它.SQLite作为一个嵌入式的数据库引擎,专门适用于资源有限的设备上适量数据存取,现在的主流移动设备像Android.iPhone等都使用SQLite作为复杂数据的存储引擎,并且它是以手机内存为储存的. 那么,实际开发项目中有大量数据需要读写,并且需要面临大量用户的并发储存的情况呢.就不应该把数据存放在手机等移动设备的SQLite数据库里,移动设备的储存能力和计算能力都不足以

Android笔记——Android中数据的存储方式(二)

我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效率.如果学过JavaWeb的朋友,首先可能想到的是数据库.当然了数据库是一个方案,那么是否还有其他的解决方案呢?今天我们在讲下Android笔记——Android中数据的存储方式(一) 提到的除了SharedPreferences和Files(文本文件)以外的其他几种数据储存方式:xml文件.SQL

Android数据存储之Android 6.0运行时权限下文件存储的思考

前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以往直接sdcard根目录上直接新建了一个xxx/cache/目录来做文件存储就会不是那么容易控制了,所以有必要重新认识一下Android文件存储的相关知识了. 背景: 有关外置sdcard的读写权限 <uses-permission android:name="android.permissi

android数据存储_外部存储

源码下载(免下载积分):下载 外部存储并不是一定可以访问的,例如外部存储挂载到电脑上是,或者是SD Card作为外部存储,被移除是,因此在访问外部存储时,一定要保证外部存储是可以获得的.判断外部存储是否已经挂载到了手机上可以这样判断: //判断外部存储是否可以访问,并且可以读写 private boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Enviro

Android数据存储(2):Internal Storage

Android数据存储的第二种形式是Internal Storage,即内部存储. 内存存储的特点是存储的是私有数据,其存储位置是在手机内存,一种是普通的文件存储,另一种是文本或图片在内存的缓存. 内部缓存的存放位置/data/data/包名/files 或 /data/data/包名/cache 1.create and write a private file to the internal storage: 步骤: 1)调用 openFileOutput()方法,返回的是一个FileOut

android 数据存储的几种方式

总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式:数据库用起稍烦锁一些,但它有它的优点,比如在海量数据时性能优越,有查询功能,可以加密,可以加锁,可以跨应用,跨平台等等:网络,则用于比较重要的事情,比如科研,勘探,航空等实时采集到的数据需要马上通过网络传输到数据处理中心进行存储并进行处理. 对于Android平台来讲,它的存储方式也不外乎这几种,按方式总体来分,也是文件,数据库和网络.但从开发者的