구글이나 네이버에서

안드로이드 외장메모리 용량체크 라고 검색하면

흔히 볼수 있는 소스코드입니다.



public static long getAvailableInternalMemorySize() {

File path = Environment.getDataDirectory();

StatFs stat = new StatFs(path.getPath());

return stat.getBlockSize() * stat.getAvailableBlocks();

}


http://developer.android.com/reference/android/os/StatFs.html

이걸 보면 좀 이상한게 있을 겁니다.

분명히 이 메서드의 리턴 타입은 long인데 리턴되는 값은 int * int입니다.



첨엔 저게 되는지도 의문이었지만, 일단 쓰고 보니 용량을 제대로 읽어오지 못하는 경우가 있었습니다.

그 이유는... 아마 int가 캐스팅되면서 unsigned long이 아닌 signed long으로 바뀌어 버린것 같습니다.

(음수가 튀어나오는걸 보니 그럴 거라고 추측만 합니다. 전문가의 도움이 필요합니다...)


그래서 이걸 리턴하기 전에 long형으로 캐스팅 해 주거나, 리턴될 값을 unsigned로 변환하는 작업이 필요합니다.

거의 1주일동안 끙끙 앓다가.. 우연히 자료형에 대한 블로그 포스트를 보다가 알고 말았습니다.. 흑흑



그래서 결론은


public
 static long getAvailableInternalMemorySize() {

File path = Environment.getDataDirectory();

StatFs stat = new StatFs(path.getPath());

return (long) stat.getBlockSize() * (long) stat.getAvailableBlocks();

}


이렇게 쓰시면 됩니다.

안드로이드펍 irc에서 동네북을 맡고있는 퐁퐁입니다.
iOS/Android/Python/PHP
타의로 배운 기술은 잘 까먹습니다.. ㅠㅠ