From:http://blog.csdn.net/u011290399/article/details/10363881
在项目中,发现通过Android提供的API获取外置SDCard的操作一直不能成功,一直没有太多的时间解决该问题
昨天週末,终于可以抽空研究了一下这个问题了
在网上搜索下,结果百度的搜索引擎怎麽搜索也未能给我满足需求的搜索结果
不过,搜索出的内置SDCard与外置SDCard互换操作给出了思路
先看看SDCard的路径:/storage/extSdCard、/storage/sdcard0、/storage/sdcard0/external-sdcard、/storage/external-sdcard等等路径
网络上给出的很多比较挫的方法:
1、通过Android的API获取其父路径的File对象,然后获得File对象内的文件路径字符串数组,遍历、寻找出外置SDCard路径,看上面给出的SDCard路径就发现不能完全实现
2、通过StorageManager类反射获得getVolumePaths的结果集,测试一部手机通过,不过没太多的保障
3、写死路径…… 尼玛,这个能是一个程序员说出的话,小爷当时看到都诅咒说出这句话的家伙
4、根据网上搜索出来外置、内置SDCard互换操作,想到是否可以读取vold.fstab文件,直接获得外置SDCard路径,结果发现好多手机上找不到vold.fstab文件……
虽然找不到vold.fstab文件,但是该文件内的信息还是存放在手机的内存中的,所以,方法就来了。
// private static String cmd = "mount"; private static String cmd = "cat /proc/mounts"; private static String format = "sdcard"; private static String sdCard = Environment.getExternalStorageDirectory().getAbsolutePath();
/** * 獲取外置SDCard的絕對路徑 * @return */ public static String getExternalPath() { BufferedReader read = null; String external_SDCard = sdCard; Runtime runtime = Runtime.getRuntime(); try { Process process = runtime.exec(cmd); read = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = read.readLine()) != null) { // if (line.toLowerCase().contains(format) && line.contains(".android-secure")) { if (line.toLowerCase().contains(format)) { String[] array = line.split(" "); if (array != null && array.length >= 5) { String temp = array[1].replace("/.android_secure", ""); if (!sdCard.equals(temp)) { external_SDCard = temp; } } } } } catch (Exception e) { external_SDCard = sdCard; e.printStackTrace(); } finally { IOUtils.freeResource(read, null); } return external_SDCard; }