在Android平台中提供了一种获取sdcard的方法即Environment.getExternalStorageDirectory()来得到文件对象 之后通过getAbsolutePath()来获得路径 这样就产生了一个问题——这个路径是内置的SDcard路径还是外接的SDcard路径。
在不同的手机中读取的路径是不一样的,通常会在/storage/下的一个软连接的目录,而这个软连接连接到了那里就只有Android系统的开发来决定的,因此判断此路径是否为内置SDcard只能通过C/C++提供的fstat/stat等提供的方法来一级一级的寻找它的最终挂载点来进行判断,如果在Android代码中可以通过他的父路径执行ls -l 读取最后一个字段的信息来一级一级的寻找,我认为除了必须区分是内置还是外置sdcard外可以通过以下的方法来获取sdcard的路径
system/etc/vold.fstab中会有几个sdcard路径的软连接 设备允许挂载多少sdcard就会有多少行有效配置信息,可以通过读取它的配置信息来获取sdcard的所有的软连接,之后通过一些比较判断筛选出我们多需要的路径。
try {
FileReader fr = new FileReader("/system/etc/vold.fstab");
BufferedReader br = new BufferedReader(fr);
while (br.ready()) {
String line = br.readLine().trim();
if (line.startsWith("dev_mount")) {
String[] arrStr = line.split(" ");
if (arrStr.length >= 5 && arrStr[0].equals("dev_mount")
&& arrStr[1].startsWith("sdcard")) {
File f = new File(arrStr[2]);
if(f.exists() && f.canWrite() && !FileUtils.comparetoExternalStorageDirectory(f)) {
br.close();
return arrStr[2];
}
}
}
}
br.close();
} catch (Exception e) {
}
在看看FileUtils的代码
public static boolean comparetoExternalStorageDirectory(File f){
File sdFile = Environment.getExternalStorageDirectory();
if(sdFile.listFiles().length != f.listFiles().length) {
return false;
}
StatFs sdStatFs = new StatFs(sdFile.getAbsolutePath());
StatFs fStatFs = new StatFs(f.getAbsolutePath());
if(sdStatFs.getAvailableBlocks() * sdStatFs.getBlockSize()
== fStatFs.getAvailableBlocks()*fStatFs.getBlockSize() &&
sdStatFs.getBlockCount() * sdStatFs.getBlockSize()
== fStatFs.getBlockCount() * fStatFs.getBlockSize() &&
sdStatFs.getFreeBlocks() * sdStatFs.getBlockSize()
== fStatFs.getFreeBlocks() * fStatFs.getBlockSize() ) {
Log.e(TAG, "File size is equal");
return true;
}
return false;
}
上面只是我写的一个小例子 只是进行了最简单的逻辑判断 如果大家有更好的方法欢迎给我留言 上面的代码非常简单 不做过多的解释 为了方便阅读,我把配置文件也贴出来
## Vold 2.0 Generic fstab
## - San Mehat (san@android.com)
##
#######################
## Regular device mount
##
## Format: dev_mount <label> <mount_point> <part> <sysfs_path1...>
## label - Label for the volume
## mount_point - Where the volume will be mounted
## part - Partition # (1 based), or 'auto' for first usable partition.
## <sysfs_path> - List of sysfs paths to source devices
######################
## Example of a standard sdcard mount for the emulator / Dream
# Mounts the first usable partition of the specified device
dev_mount sdcard /storage/sdcard0 emmc@fat /devices/platform/goldfish_mmc.0 /devices/platform/mtk-msdc.0/mmc_host
dev_mount sdcard2 /storage/sdcard1 auto /devices/platform/goldfish_mmc.1 /devices/platform/mtk-msdc.1/mmc_host
## Example of a dual card setup
# dev_mount left_sdcard /mnt/sdcard1 auto /devices/platform/goldfish_mmc.0 /devices/platform/mtk-sd.0/mmc_host/mmc0
# dev_mount right_sdcard /mnt/sdcard2 auto /devices/platform/goldfish_mmc.1 /devices/platform/mtk-sd.2/mmc_host/mmc2
## Example of specifying a specific partition for mounts
# dev_mount sdcard /mnt/sdcard 2 /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1
对比上面没有被#号注掉的配置信息 我想大家都能够看明白的 !!!!!!!!!!!!!