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;
    }
原文地址:https://www.cnblogs.com/niray/p/4251309.html