Androidで外部ストレージのパスを取得する方法

現在Androidで外部ストレージのパスを取得するAPIが存在しない。

Androidでストレージのパスを取得するEnvironment.getExternalStorageDirectory()は、 内部ストレージが存在する場合、名前に反して内部ストレージのパスを返す。(これは、既存プログラムの互換性を考えた時に、必要な考慮と思われる。)

そのため、以下を参考にして/system/etc/vold/fstabを使用する方法で取得することにした。

(参考http://inujirushi123.blog.fc2.com/blog-entry-93.html

Xperia VLの/system/etc/vold.fstabを確認したところ

内部ストレージがfuse_mountで定義されていたため、追加している。

static private List getStoragePaths() {
        List mountList = new ArrayList();

        Scanner scanner = null;
        try {

            scanner = new Scanner(new FileInputStream(new File(
                    "/system/etc/vold.fstab")));
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                if (line.startsWith("dev_mount") || line.startsWith("fuse_mount")) {

                    String path = line.split(" ")[2].replaceAll(":.*$", "");

                    if (!mountList.contains(path)){
                        File dir = new File(path + "/");
                        if (dir.canRead()){
                            mountList.add(path);
                        }
                    }
                }
            }
        } catch (Exception e) {
            mountList = new ArrayList();
            mountList.add(Environment.getExternalStorageDirectory().getAbsolutePath());

        } finally {
            if (scanner != null) {
                scanner.close();
            }
        }

        return mountList;
    }