티스토리 뷰

안드로이드는 SD카드를 삽입하지 않아도 SD카드 영역이 존재한다.

내부메모리상에 어느정도 할당하여 SD카드라 칭하고 사용하고 있다.

이것이 내부SD카드메모리영역.

하지만 사용자가 물리적인 SD카드를 삽입하면 인것은 더이상 SD카드로 인식하지 않는다.

추가적인 드라이브로 마운트되는데 이 경로를 소스에서 직접적으로 구해올 수 없다.




내부메모리에 할당된 SD카드경로: Environment.getExternalStorageDirectory()


외부SD카드의 경로 찾기

아래 소스를 이용하면 Interator 로 마운트된 드라이브의 경로를 조회해온다.

안드로이드 시스템에서는 SD카드 외에도 몇가지 마운트하는이 있는데 이부분도 제외시키고 가져온다.


    static public HashSet<String> getExternalMounts(){

    final HashSet<String> out = new HashSet<String>();

        String reg = "(?i).*vold.*(vfat|ntfs|exfat|fat32|ext3|ext4).*rw.*";

        String s = "";

        try {

            final Process process = new ProcessBuilder().command("mount")

                    .redirectErrorStream(true).start();

            process.waitFor();

            final InputStream is = process.getInputStream();

            final byte[] buffer = new byte[1024];

            while (is.read(buffer) != -1) {

                s = s + new String(buffer);

            }

            is.close();

        } catch (final Exception e) {

            e.printStackTrace();

        }


        // parse output

        final String[] lines = s.split("\n");

        for (String line : lines) {

            if (!line.toLowerCase(Locale.US).contains("asec")) {

                if (line.matches(reg)) {

                    String[] parts = line.split(" ");

                    for (String part : parts) {

                        if (part.startsWith("/"))

                            if (!part.toLowerCase(Locale.US).contains("vold"))

                                out.add(part);

                    }

                }

            }

        }

        return out;

    }



exfat , fat32 ext3 ..등 이런것들이 시스템에서  마운트되는 것들이다.

리턴타입이 HashSet인 이유는 마운트되는 드라이브가 아무리 필터링을 한다고하여도 1개가 아닐 수 있기 때문이다.

제조사 또는 구글이 더이상 예외적인 이름으로 마운트를 추가하지 않았으면 좋겠다.


안드로이드 API들을 보면 구글이 이런식으로 SD카드 경로를 할당하려는 의도가 아니였던걸로 보인다.

하지만 삼성을 비롯해 다른 제조사 뿐아니라 구글레퍼런스 폰 또한 내부메모리에 SD카드 영역을 할당해놓고 출시하고 있다.

지금 폰에 꼽은 SD카드메모리가 /mnt/sdcard 가 아니라는 것은 알아두어야 할 사항이다.





댓글