首先明确一下概念,手机外置存储器是什么?
目前的Android手机分为支持TF卡扩展和不支持TF卡扩展两种,一些手机称配置内存16G,32G,64G,128G等不支持TF卡存储扩展,而另一些手机配置内存8G,16G等,同时支持TF卡存储扩展。这里的内存,Android官方称为primary external storage,一般只能有一个,而TF外存储卡,官方称其为secondary external storage,可以有零到多个。
在Android较老的版本中,外置存储器路径一般是指的/mnt/sdcard,而我们知道当前的部分Android手机支持存储卡扩展功能,于是Android将相关的路径挪到了/storage下面统一管理,打开Eclipse的DDMS->File Explorer,可以看到Android的文件目录树
在/mnt/sdcard的目录属性中可以看到这个目录其实是一个连接,关于存储的文件目录树如下图
在上面的目录树中可以看出Android对存储器的管理都统一到/storage下面,外存储器对应了sdcard0,sdcard1,sdcard2,sdcard3....(如果有手机提供两个以上TF卡扩展槽的话,市面上好像没有这种手机),之前的/mnt/sdcard指向/storage/emulated/legacy,同时sdcard0也是指向/storage/emulated/legacy,说明两者都是指的手机自带的外置存储器(手机自带的内存)。同时在/storage下有一个sdcard1目录,这个目录对应的就是手机的TF存储扩展卡。
那么问题来了,开发人员会发现通过方法Environment.getExternalStorageDirectory()获取的是手机自带的外置存储路径/storage/emulated/0(这个路径不同的手机可能不同,但都是指向/storage/emulated/legacy),即primary external storage路径。怎么操作真正的外置TF卡?Android4.3之前可以用/storage/sdcard1表示外置TF卡路径,并在该目录下进行任意读写操作,然而从Android4.4开始,官方对第三方App的读写权限做了限制,应用不能随意操作外置TF卡的根目录,可以读/storage/sdcard1,不能写/storage/sdcard1,这就使应用不能随便在TF卡上创建文件夹。同时Android给第三方App保留了应用私有目录/storage/sdcard1/Android/data/[com.package.name]/files/,在该目录下应用拥有读写权限,该目录有一个特点就是一旦应用卸载,该文件夹下的文件也就随之删除,所以有的应用会给用户一个文件可能随卸载删除的提示。
最后,如何获取到这个应用私有目录路径呢?
File[] filearray = getExternalFilesDirs(null);
for (File file : filearray) {
System.out.println(file.toString());
}
上面的代码通过getExternalFilesDirs()获取了所有外置存储器的应用私有目录路径,路径数组可能是
/storage/emulated/0/Android/data/com.example.httpdownloadtest/files <=内外置存储器路径
/storage/sdcard1/Android/data/com.example.httpdownloadtest/files <=TF卡路径