本文链接:http://blog.csdn.net/qq_16628781/article/details/61195621

Android之存储知识

知识点:

1、获取内部/外部存储空间方法介绍;

2、存储中需要的注意事项;

当我们需要用到存储数据的时候,例如音频文件,视频文件或者是下载的apk等等,我们应该如何来选择存放的目录呢。是放在自己APP所能接触到而其他APP无法解除的内部文件夹?还是需要共享的外部文件夹里头?

Google为我们提供了getExternalStorageDirectory(),getExternalFilesDir(),getExternalCacheDir(),getExternalMediaDirs(),getExternalStoragePublicDirectory()等等的API给我们,我们又该如何选择使用呢?

最近重新看了getExternalStorageDirectory()这个方法。然后看了他的源码说明,又发现了不少好的东西,这里我针对我所看到的这个说明,做一个剪短而有用的说明,记录一下,让自己可以有一个更加明确的记忆。关于应该要将文件存储在哪里做一个小结。

public static File getExternalStorageDirectory() {throwIfUserRequired();return sCurrentUser.getExternalDirs()[0];}

这个方法:返回的是优先存储共享/外部文件的文件夹。共享文件就是其他app可以访问的数据,例如我们在网易云下载的音乐,一般都是放在sdcard里头的,我们自己的APP也可以去访问这些音频文件。如果返回的目录被其他计算机占用,或者被移除了,或者其他问题发生了,就有可能不能访问。你可以利用getExternalStorageState()方法来判断是否可用。

有以下状态:

MEDIA_UNKNOWN:未知状态
MEDIA_REMOVED:移除状态
MEDIA_UNMOUNTED:未装载状态
MEDIA_CHECKING:检查中
MEDIA_NOFS:为空或者是使用了不支持的文件系统
MEDIA_MOUNTED:装载了
MEDIA_MOUNTED_READ_ONLY:只读状态
MEDIA_SHARED:未装载,但是有USB分享
MEDIA_BAD_REMOVAL:直接移除了
MEDIA_UNMOUNTABLE:不可装载的,可能是因为存储盘坏了

回到正题:

不要被“外部”这个词混淆了。最好是想象成是媒体/共享文件夹,这是不用强制的权限的。一般来说,这个是sd卡,但是也有可能是来自内部存储空间被装载为文件系统。

在某些设备中,我们还有可能是多用户的,但是这也是每个用户都有自己相互隔绝的存储空间,每个用户只能访问自己的存储空间。

这里有一个警告:我们最好不要直接使用存储目录的根目录(即是我们应该在根目录下创建新的目录来存放我们的数据),因为这样可以避免我们把设备的根目录弄乱。想像一下,如果每个APP都将数据放在根目录下面,那么根目录因为文件多到不行而不好管理了。通常,设备的存储空间是有限的,而且用户不一定会去管理(删除)一些文件,因为他们不知道哪些是应该删掉的。

私有的文件我们可以存储在由getExternalFilesDir()返回回来的路径下,在这个文件路径下的文件,在APP卸载之后,也会被一并删除。而需要共享的文件我们应该放在由getExternalStoragePublicDirectory()返回的路径的文件夹下面。

从API19(android.os.Build.VERSION_CODES#KITKAT)开始,如果你的APP只需要内部存储空间,可以考虑使用getExternalFilesDir(String)/getExternalCacheDir()/getExternalMediaDirs()返回的路径,使用以上3个方法,是不需要申请读写权限的。

注意一点:由于不同的SDK版本返回的路径可能被修改,所以最好使用相对路径。

下面说下getExternalFilesDir(String type)方法

此方法优先返回共享/外部的存储空间绝对路径,用来保存APP的持久化数据,而且不需要权限。对APP来说是内部的,也不可以给设备用户看见。此文件夹也会被删除,当APP被卸载的时候。

但是和getFilesDir()主要有两点不同:

1、共享的空间不一定都是可用的。有可能用户弹出了sd卡,可以用getExternalStorageState()来检查是否可用。

2、共享空间里的数据不是绝对安全的。拥有写权限就可以在里头写入数据。

入参有以下几个:

Environment#DIRECTORY_MUSIC
Environment#DIRECTORY_PODCASTS
Environment#DIRECTORY_RINGTONES
Environment#DIRECTORY_ALARMS
Environment#DIRECTORY_NOTIFICATIONS
Environment#DIRECTORY_PICTURES
Environment#DIRECTORY_MOVIES

返回的是给定的类型的子目录的路径。

这些文件默认是不会自动的被媒体库扫描到的。你也可以利用MediaScannerConnection#scanFile(Context, String[], String[], android.media.MediaScannerConnection.OnScanCompletedListener)加入到媒体数据库中,然后就可以被扫描到了。

getExternalCacheDir()方法

此方法返回的是用来保存APP缓存数据的目录,私有对于其他APP不可见和用户媒体库。

和getCacheDir()类似

getExternalMediaDirs()方法

返回APP指定的目录的绝对路径,私有不可见。

Android之获取外部存储空间解释相关推荐

  1. android应用获取手机存储空间方法

    获取手机内部空间和存储卡空间方法: public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundl ...

  2. 【错误记录】Android 分区存储下的 SD 卡应用专属外部存储空间目录访问 ( 需手动创建应用专属外部存储空间目录 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 开发时 , 需要向外置 SD 卡中拷贝一些文件 , 应用读取这些文件 , 进行相关配置 ; 但是 Android 系统 , 并不会主动为应用创建文件 ...

  3. Android之获取手机内部及sdcard存储空间

    Android之获取手机内部及sdcard存储空间 文章链接 知识点: 内部存储空间获取总大小和可用大小: sdcard存储空间获取总大小和可用大小: 新名词记录{StatFs:描述文件系统信息的类} ...

  4. 【Android 热修复】热修复原理 ( Dex 文件拷贝后续操作 | 外部存储空间权限申请 | 执行效果验证 | 源码资源 )

    文章目录 一.Dex 文件准备 二.外部存储空间权限申请 1.清单文件申请权限 2.动态申请权限 三.文件拷贝 1.文件拷贝 2.执行效果 四. 源码资源 一.Dex 文件准备 在 [Android ...

  5. Android 获取手机存储空间

    1.获取可用的内存 public String getFreeMemory(){ActivityManager am = (ActivityManager) context.getSystemServ ...

  6. android 检索空间,Android 获取手机存储空间

    1.获取可用的内存 public String getFreeMemory(){ ActivityManager am = (ActivityManager) context .getSystemSe ...

  7. Android 获取 唯一GUID ,替换 IMEI (兼容 Android 10+获取IMEI问题)

    Android 获取 唯一UUID ,替换 IMEI (兼容 Android 10+获取IMEI问题) 背景 关于 保存GUID方案 第一种,SharedPreferemces存储 第二种,sqlit ...

  8. Android 数据存储---外部存储(SD卡)

    使用外部存储实现数据持久化,这里的外部存储一般就是指的是sdcard.使用sdcard存储的数据,不限制只有本应用访问,任何可以有访问Sdcard权限的应用均可以访问,而Sdcard相对于设备的内部存 ...

  9. Android Q 获取设备唯一ID(UDID\GUID\UUID\SSAID\GAID)

    Android Q获取设备唯一ID(UDID\GUID\UUID\SSAID\GAID) 一.简介 1.1 问题背景 1.2 关键技术 二.解决方案 2.1 谷歌官方推荐方案 (4种) 2.2 实现方 ...

最新文章

  1. Fragment Injection漏洞杂谈
  2. 冒泡排序选择排序 以及时间效率对比
  3. [转]Angular2 使用管道Pipe以及自定义管道格式数据
  4. java零碎要点010---Java实现office文档与pdf文档的在线预览功能
  5. win11用户账户如何取消 windows11取消用户账户的设置方法
  6. MySQL(四)InnoDB中一棵B+树能存多少行数据
  7. nullnullUVa 10066 - The Twin Towers(LCS水题)
  8. 现代密码学第一次实验:线性移位寄存器
  9. 【考研经验】2018复旦计算机专硕零基础学渣考研经验贴
  10. python爬虫——使用selenium爬取qq群的成员信息(全自动实现自动登陆)
  11. Python-ZFJObsLib完美生成iOS垃圾代码
  12. firefox 显示网页加载时间的插件
  13. CF329B Biridian Forest
  14. JavaScript和Jqurery
  15. halcon算子——highpass_image--从图像中提取高频分量((过滤--图像边缘处理))
  16. Node.js bull Redis连接数过多
  17. 书法 | 从零学硬笔,我的三天成长路 2
  18. php表单提交到数据库详解
  19. 基于stm32的FIR滤波
  20. win7 系统盘如何瘦身! 可整理出4-5G。

热门文章

  1. ThinkPad T460s BIOS设置实现U盘启动
  2. Java集合详解6:TreeMap和红黑树
  3. element-ui 表格总计有多行的情况
  4. PS 2019 Mac版 自学入门系列(七)—— 调亮深色区域
  5. 苹果计算机 win10,苹果怎么装win10苹果装win10详细教程【图文】
  6. pycharm能不能编写Java_使用Pycharm编写第一个Python程序
  7. 阿里云配置域名CDN加速
  8. 字节跳动校招面试题演练
  9. 加西亚·马尔克斯致读者《告别信》来源:infzm.com
  10. Python Windows发出警报声、蜂鸣器、声音报警