/data //Environment.getDataDirectory().toString() api1 /cache //Environment.getDownloadCacheDirectory().toString() 1 /storage/emulated/0 //Environment.getExternalStorageDirectory().toString() 1 /storage/emulated/0/Pictures //Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES).toString() //8 mounted //Environment.getExternalStorageState().toString() //1 /system //Environment.getRootDirectory().toString() //1 /data/data/net.xx.android/cache //getCacheDir().toString() //1 /data/data/net.xx.android/files //getFilesDir().toString() //1 /storage/emulated/0/Android/data/net.xx.android/cache //getExternalCacheDir().toString() 8 /storage/emulated/0/Android/data/net.xx.android/files //getExternalFilesDir(null).toString() 8
getDir("testDir", Context.MODE_PRIVATE).getAbsolutePath() //data/data/net.xx.android/app_testDir
MODE_WORLD_READABLEandMODE_WORLD_WRITEABLEto control permissions.
html
在Android 官方开发文档中有一篇文档来介绍如何保存应用的数据,但笔者用过不少程序(从知名的到不知名的)处理的都不是很完美,或者 没有按照Android 开发团队建议的方式去保存他们应用的数据。当一些试用过的软件卸载后,在SDCard中还保留了这些软件的文件目录,时间一长就有不少目录须要手工去清理,而且很难确认那些目录是仍然在使用的 那些目录已经没用了,给用户带来困扰。这里咱们来讨论下该如何正确的保存应用的数据。 java
首先数据分为两种:和应用相关的数据;和应用无关的数据。这里分别介绍: android
应用无关的数据是那些用户比较关心的数据,无论您的应用在不在用户设备上,这些数据用户都但愿保留,这些数据包含:用相机拍摄的照片、用浏览器(下载工具)下载的文件、用户制做的个性铃声等。
假设您开发了一个照相应用(例如: 360相机),用户用您的应用拍摄并处理过的照片就属于应用无关的数据,若是用户把您的应用给卸载了,用户仍是会指望仍然保留他们拍摄并处理过的照片。这里的照片按照Android官方的建议应该保存到 DIRECTORY_PICTURES 目录中,该目录经过Environment.getExternalStoragePublicDirectory(String type)来获取,您能够在该目录下建立一个以您的程序命名的目录来保存数据。其余支持的目录列表请参考这里。
应用相关的数据: 这种数据只和您的应用相关,若是您的应用被用户删除了这些数据也没有理由还存在用户设备中。这种数据包含:数据库文件、属性配置文件、应用的缓存文件等。这种数据能够有不少种保存方式,详情参考这里。 数据库
这里咱们只讨论在API 8(Android 2.2)中新引入了一种保存到外部存储空间的伪私有数据API,经过函数getExternalFilesDir() 来获取该路径,一样能够设置获取各类类型数据的参数,例如 DIRECTORY_MUSIC 和 DIRECTORY_RINGTONES (若是参数为null则返回您应用数据的跟目录)。好比一个应用的包名为 org.goodev.test 的应用,经过函数getExternalFilesDir(Environment.DIRECTORY_MOVIES)获取到的文件路径为/storage/sdcard0/Android/data/org.goodev.test/files/Movies。 api
细心的读者已经发现,该数据目录为SDCard (外部存储设备,有多是内置SDCard 好比 Nexus S) 中名字为 Android 的根目录下,该目录下有个用来保存应用数据的 data 目录,在这个 data 目录中保存了设备中各个应用的数据,依包名来命名,若是设置参数为null则返回的是跟目录:/storage/sdcard0/Android/data/org.goodev.test/files。 浏览器
为啥这个目录咱们称之为伪私有数据目录呢? 由于在2.2以上的系统中,当您的应用被用户卸载的时候,保存在这个目录下的数据也会被系统删除;而且在默认状况下多媒体扫描器不会扫描该目录下的图片、MP3等多媒体文件– 从这个角度看这个目录是应用的私有数据目录。 因为该目录存在于外部存储空间中,任何其余具备读写外部存储空间权限的应用均可以访问您的应用数据 — 从这个角度看这些数据又不是私有的。 因此咱们就称之为 伪私有数据。 缓存
那么为何Android在2.2中引入这种伪私有数据保存方式呢? 这样应用的数据不是很不安全吗? 这种存储方式适合保存那些数据呢? 下面咱们来逐个分析下这些问题: 安全
为什么引入这种存储方式?
有些Android应用在使用过程当中,可能会产生不少须要保存的文件数据,而这些数据须要在应用卸载的时候被删除掉,按照2.2以前的方式,这种需求的数据只能保存到内部存储空间中,而系统的内部存储空间都是有限的,为了让用户能在有限的存储空间中安装更多的应用,因此出现了这种存储方式。我的观点仅供参考 \(^o^)/~。 app
存储在伪私有目录的数据是否是很不安全?
固然是不安全的,任何应用都有可能访问这些数据,因此通常而言这里只保存那些不是很是敏感的数据,因为这些目录中的数据有可能被用户或者其余应用删除掉,因此在使用这里面的数据的时候要先检测下数据是否存在、有效,若是无效则须要重新下载使用。 ide
这种存储方式适合那些数据呢?
好比一个图片浏览类的应用,用该目录来保存系统图片的缩略图方便提升应用浏览图片的流畅度;或者图书类应用用来保存图书的封面图片等。
若是您的应用运行在旧的设备(低于2.2的版本)上,则您也应该按照上面的建议把文件保存到 /Android/data//files/ 目录下,这样若是用户更新的设备版本后,这些数据就随着应用的卸载而被删除掉了。
遗留问题
固然也有一些比较有争议的数据,好比 IM聊天软件接收到的图片和自定义表情数据 应该保存到SDCard中呢仍是上面介绍的 伪私有数据 存储目录中呢? 若是用户卸载了聊天软件,用户是否指望继续保存他们接收到的图片和自定义表情图片呢? 这个问题恐怕针对不一样的用户获得的答案是不同的。这时,咱们咋办??
我的建议针对这种没有明确界限的需求,能够在用户第一次使用程序的时候,引导用户去设置他们的这些数据保存到哪里?保存到外部存储空间(应用卸载后数据依然存在);或者保存到应用外部存储目录中(应用卸载后数据自动删除)。 这种作法相似下载一些PC软件的作法,好比一些软件在卸载的时候会填出对话框让用户选择是否保留用户数据。只不过在Android系统中卸载应用目前没办提供该功能,因此只能在应用第一次使用的时候 让用户知道有这么个设置项。
PS:笔者目前最反感的就是一些应用下载了不少小图片到SDCard中,而后打开图库应用会发现里面有不少这种小图片(好比人的头像啦、物品缩略图啦、图书封面图片啦),这种数据就不该该出如今用户的图库应用中去。 若是把这些数据保存到上述的伪私有数据目录中则 就不会出现这种问题。 目前为了不这种问题,笔者不得不本身在各类目录中建立“.nomedia”文件。至关繁琐啦!