Android之获取外部存储空间解释
本文链接: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之获取外部存储空间解释相关推荐
- android应用获取手机存储空间方法
获取手机内部空间和存储卡空间方法: public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundl ...
- 【错误记录】Android 分区存储下的 SD 卡应用专属外部存储空间目录访问 ( 需手动创建应用专属外部存储空间目录 )
文章目录 一.报错信息 二.解决方案 一.报错信息 开发时 , 需要向外置 SD 卡中拷贝一些文件 , 应用读取这些文件 , 进行相关配置 ; 但是 Android 系统 , 并不会主动为应用创建文件 ...
- Android之获取手机内部及sdcard存储空间
Android之获取手机内部及sdcard存储空间 文章链接 知识点: 内部存储空间获取总大小和可用大小: sdcard存储空间获取总大小和可用大小: 新名词记录{StatFs:描述文件系统信息的类} ...
- 【Android 热修复】热修复原理 ( Dex 文件拷贝后续操作 | 外部存储空间权限申请 | 执行效果验证 | 源码资源 )
文章目录 一.Dex 文件准备 二.外部存储空间权限申请 1.清单文件申请权限 2.动态申请权限 三.文件拷贝 1.文件拷贝 2.执行效果 四. 源码资源 一.Dex 文件准备 在 [Android ...
- Android 获取手机存储空间
1.获取可用的内存 public String getFreeMemory(){ActivityManager am = (ActivityManager) context.getSystemServ ...
- android 检索空间,Android 获取手机存储空间
1.获取可用的内存 public String getFreeMemory(){ ActivityManager am = (ActivityManager) context .getSystemSe ...
- Android 获取 唯一GUID ,替换 IMEI (兼容 Android 10+获取IMEI问题)
Android 获取 唯一UUID ,替换 IMEI (兼容 Android 10+获取IMEI问题) 背景 关于 保存GUID方案 第一种,SharedPreferemces存储 第二种,sqlit ...
- Android 数据存储---外部存储(SD卡)
使用外部存储实现数据持久化,这里的外部存储一般就是指的是sdcard.使用sdcard存储的数据,不限制只有本应用访问,任何可以有访问Sdcard权限的应用均可以访问,而Sdcard相对于设备的内部存 ...
- 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 实现方 ...
最新文章
- Fragment Injection漏洞杂谈
- 冒泡排序选择排序 以及时间效率对比
- [转]Angular2 使用管道Pipe以及自定义管道格式数据
- java零碎要点010---Java实现office文档与pdf文档的在线预览功能
- win11用户账户如何取消 windows11取消用户账户的设置方法
- MySQL(四)InnoDB中一棵B+树能存多少行数据
- nullnullUVa 10066 - The Twin Towers(LCS水题)
- 现代密码学第一次实验:线性移位寄存器
- 【考研经验】2018复旦计算机专硕零基础学渣考研经验贴
- python爬虫——使用selenium爬取qq群的成员信息(全自动实现自动登陆)
- Python-ZFJObsLib完美生成iOS垃圾代码
- firefox 显示网页加载时间的插件
- CF329B Biridian Forest
- JavaScript和Jqurery
- halcon算子——highpass_image--从图像中提取高频分量((过滤--图像边缘处理))
- Node.js bull Redis连接数过多
- 书法 | 从零学硬笔,我的三天成长路 2
- php表单提交到数据库详解
- 基于stm32的FIR滤波
- win7 系统盘如何瘦身! 可整理出4-5G。