首页 > 代码库 > Android之內置、外置SDCard

Android之內置、外置SDCard

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;    }

 

Android之內置、外置SDCard