구글이나 네이버에서
안드로이드 외장메모리 용량체크 라고 검색하면
흔히 볼수 있는 소스코드입니다.
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();
}
이렇게 쓰시면 됩니다.
와우, 좋은 자료 감사합니다.ㅎ
int * int가 되어서 int값으로 계산이 되는 것 같은데, 둘 중 하나만 long으로 캐스팅해줘도 되지 않을까요?
1 / 2를 할때 0.5라는 값을 얻으려면 둘중 하나만 float으로 캐스팅 해주듯이...