티스토리 뷰
안드로이드는 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 가 아니라는 것은 알아두어야 할 사항이다.
'Development' 카테고리의 다른 글
[Android] Android Build Process (0) | 2013.11.11 |
---|---|
[Android] 마운트된 드라이브의 전체/가용용량 구하기 , 바이트용량 구하기 (0) | 2013.10.28 |
[Android] RejectedExecutionException 처리 (0) | 2013.10.25 |
[Android] exception.printStackTrace to String (0) | 2013.10.17 |
[Android] DPI 별 이미지 배율 (0) | 2013.10.08 |
- Total
- Today
- Yesterday