Android sdcard的路径问题

在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

对比上面没有被#号注掉的配置信息  我想大家都能够看明白的 !!!!!!!!!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值