现在的手机很少有外置存储卡了,外置存储卡也就是我们常说的SD卡,但是有时候在开发的时候也需要兼容老款的手机,而且Android的一些接口从表面上看有歧义,导致很多人理解对应的接口出现偏差,下面就来具体说说Android中关于SD卡的相关接口。
一般我们获取手机的SD卡的路径都是如下获取:
String path= Environment.getExternalStorageDirectory().getAbsolutePath();
看到这个接口的名字,很多人肯定和我一样认为获取的路径是外置存储卡(SD卡)的路径,尤其是再看到下面的这两个接口就更会这么认为。
String state = Environment.getExternalStorageState();
//是否挂载
boolean result = state.equals(Environment.MEDIA_MOUNTED)
我经过多次测试发现不是这样的,第一个接口中获取到的 path
是手机内置存储的路径,打印结果如下:
/storage/emulated/0
因为Android是基于Linux的,所以文件系统和Linux一样,前面的 / 就是根目录,但是将手机连上电脑去查看目录,没有storage目录,看手机上自带的文件管理器也找不到,后来加载了一个RE文件管理器才看明白了这个目录。
而如果你的手机可以添加外置存储卡,通过手机中的文件管理工具我们可以找到外置存储卡的路径为
/storage/sdcard1
全部的目录结构如下:
/
|__storage
| |__emulated
| | |__0
| | |__...
| |__sdcard0
| |__sdcard1
| |__...
|__...
其中sdcard1就是你的SD卡的路径,如果手机不能插入SD卡,就没有这个目录,而sdcard0和 emulated/0 这个目录是相同的。那么为什么还有判断SD卡是否挂载的方法呢?按理说手机是肯定会有内置存储的呀,我想这个应该和Linux那些发行版系统一样,所有的硬盘都是可以挂载和卸载的,所以添加了这个方法,作为安全判断也好。
除此之外,还有一个方法用来读取data/data/<package mane>/files 目录下的文件
//方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,系统会自动创建它
FileOuputStream fos = context.openFileOutpu("user.txt",context.MODE_PRIVATE);//打开应用程序私有目录下的指定私有文件以写入数据
FileInputStream fis = context.openFileInput("user.txt");// 打开应用程序私有目录下的指定私有文件以读入数据
通过root的手机是可以看到data/data的目录下生成的文件,使用没有root的手机通过先写入再读取也可以验证放到了这个目录。
至此,我们就弄明白了Android手机的内外存储对应对应的API,本次测试手机使用的华为mate8
欢迎关注我的微信公众号,我会把一些生活的感想和投资方面的总结写到公众号,希望你能来和我一起交流技术之外的东西。