답변
this 게시물은 귀하의 질문에 잘 어울릴 수 있습니다.
도 확인 this thread입니다. 여기에 너무 많은 정보가 있습니다.
는 조금 봤 여기에StatFs
클래스를 사용할 필요있을 것 같습니다 (
android git에 있음) 솔루션
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return Formatter.formatFileSize(this, availableBlocks * blockSize);
입니다. 어떤 경로가 장치의 루트로 간주 될지 확실하지 않지만 내부 저장소의 일부인 경우 디렉토리에 관계없이 결과가 동일하다고 생각합니다. 이런 식으로 뭔가 작동 할 수 있습니다 : 다른 건 몰라도
StatFs stats = new StatFs("/data");
int availableBlocks = stats.getAvailableBlocks();
int blockSizeInBytes = stats.getBlockSize();
int freeSpaceInBytes = availableBlocks * blockSizeInBytes;
는 StatFs 클래스는 당신이 볼 수있는 위치에 좋은 시작을 제공해야합니다.
쿨! 나는 "/"을 위해 그것을 얻으려고 노력했다. "/ data"를 사용하면 내부 메모리가 작동합니다. –
내부 메모리 크기가 매우 큰 장치에서는 int 값이 너무 작기 때문에 작동하지 않습니다. 예를 들어 Motorola xum에서는 작동하지 않습니다. 당신이 뭔가를 사용해야합니다 (같은 1 메가, 1 기가 바이트) 인간이 읽을 수있는 형식에 바이트를 변환
int freeSpaceInKilobytes = availableBlocks * (blockSizeInBytes/1024);
또는 int가 아닌 long 형식을 사용하십시오. –
/*************************************************************************************************
Returns size in bytes.
If you need calculate external memory, change this:
StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
to this:
StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());
**************************************************************************************************/
public long TotalMemory()
{
StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
long Total = ((long) statFs.getBlockCount() * (long) statFs.getBlockSize());
return Total;
}
public long FreeMemory()
{
StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
long Free = (statFs.getAvailableBlocks() * (long) statFs.getBlockSize());
return Free;
}
public long BusyMemory()
{
StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
long Total = ((long) statFs.getBlockCount() * (long) statFs.getBlockSize());
long Free = (statFs.getAvailableBlocks() * (long) statFs.getBlockSize());
long Busy = Total - Free;
return Busy;
}
public static String floatForm (double d)
{
return new DecimalFormat("#.##").format(d);
}
public static String bytesToHuman (long size)
{
long Kb = 1 * 1024;
long Mb = Kb * 1024;
long Gb = Mb * 1024;
long Tb = Gb * 1024;
long Pb = Tb * 1024;
long Eb = Pb * 1024;
if (size < Kb) return floatForm( size ) + " byte";
if (size >= Kb && size < Mb) return floatForm((double)size/Kb) + " Kb";
if (size >= Mb && size < Gb) return floatForm((double)size/Mb) + " Mb";
if (size >= Gb && size < Tb) return floatForm((double)size/Gb) + " Gb";
if (size >= Tb && size < Pb) return floatForm((double)size/Tb) + " Tb";
if (size >= Pb && size < Eb) return floatForm((double)size/Pb) + " Pb";
if (size >= Eb) return floatForm((double)size/Eb) + " Eb";
return "???";
}
수학을하기 전에 blockCount와 blockSize를 long으로 형변환해야합니다. 그렇지 않은 경우, 총 블록 수와 블록 크기의 곱이 int의 최대 값을 초과하므로이 메소드는 음수 값을 반환 할 수 있습니다. 예, 코드를 사용하여 네거티브를 얻었습니다. – christophercotton
@christophercotton 감사합니다! 끝난. – XXX
실제로 (길게) statFs.getBlockCount() * (long) statFs.getBlockSize()를 수행하여 올바르게 캐스팅되도록해야합니다. – christophercotton
/**
* @return Number of bytes available on internal storage
*/
public static long getInternalAvailableSpace() {
long availableSpace = -1L;
try {StatFs stat = new StatFs(Environment.getDataDirectory()
.getPath());
stat.restat(Environment.getDataDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
} catch (Exception e) {
e.printStackTrace();
}
return availableSpace;
}
이 링크를 참조하시기 바랍니다 : Android get free size of internal/external memory 도움이 될 수 있습니다. 여기서 모든 것이 좋은 방법으로 설명됩니다.
가 2013 년부터 구글에 의해 사용되지 않는 몇 가지 방법이 있으며 이러한 방법 (API 18 세 이상 만) 변경 될 수 있습니다 :
getAvailableBlocks()
getBlockCount()
getBlockCountLong()
getBlockSize()
에getAvailableBlocksLong()
-getBlockSizeLong()
에
getFreeBlocks()
togetFreeBlocksLong()
- 1. 여유 디스크 공간 계산
- 2. C# ColumnHeader의 여유 공간 배경색
- 3. 장치 여유 공간 및 사용 된 샌드 박스 공간
- 4. .NET에서 총 디스크 여유 공간 찾기
- 5. FTP 및 HTTP 여유 공간 크기의 경우
- 6. CAKeyframeAnimation - 경로를 따라 이동하고 여유 공간 사용
- 7. 원격으로 Windows 탑재 지점의 디스크 공간 확보
- 8. 장치 내부 저장 공간 얻기
- 9. Wipe C#을 사용하는 하드 디스크 드라이브의 여유 공간
- 10. 테이블에서 데이터를 삭제 한 후의 Oracle 여유 공간
- 11. 의 여유 공간 가져 오기 "C를 :"드라이브를 사용하여 배치 파일
- 12. 매핑 된 드라이브의 여유 공간 비율을 찾는 방법은 무엇입니까?
- 13. 내부 메모리에 이미지 저장 및 갤러리에 나타납니다
- 14. 내부 메모리에 사용자 입력 데이터 저장
- 15. 내부 메모리에 앱 데이터를 만들면 괜찮습니까?
- 16. Android 개발 내부 메모리/앱 공간 문제
- 17. 카산드라의 내부 키 공간 "시스템"의 사용
- 18. .NET 응용 프로그램의 주소 공간에서 dll 이미지를 재정렬하여 연속적인 여유 공간을 확보 할 수 있습니까?
- 19. VME 버스를 PCI를 통해 사용자 공간 메모리에 오버레이하려면 mmap?
- 20. 음수 여유 메모리
- 21. "여유 시간"이 있습니까?
- 22. 세션 ID 확보
- 23. 파일 잠금 확보
- 24. GNU/Linux의 사용자 프로세스에서 ARM의 내부 메모리에 액세스
- 25. xcode를 사용하여 파일 내용을 iphone의 내부 메모리에 저장하는 방법?
- 26. 내부 장치 메모리에 다운로드 된 파일에 액세스하는 방법
- 27. sd 카드가 아닌 내부 메모리에 데이터를 저장 하시겠습니까?
- 28. DC SYSVOL 정보 (경로, 크기, 여유 공간)를 가져 오는 VBScript
- 29. 부풀린 innodb 데이터 파일 (ibdata1)과 공간 재 확보 방법은 무엇입니까?
- 30. 공간
[안드로이드의 내부/외부 메모리 크기 확보] 가능한 복제본 (https://stackoverflow.com/questions/8133417/android-get-free-size-of-internal-external-memory) –