2011-01-04 4 views
37

Android SDK를 통해 안드로이드 장치 (SD 카드가 아닌)의 사용 가능한 메모리 양을 확보 할 수 있습니까?내부 메모리에 여유 공간 확보

그렇다면 어떻게됩니까?

+2

[안드로이드의 내부/외부 메모리 크기 확보] 가능한 복제본 (https://stackoverflow.com/questions/8133417/android-get-free-size-of-internal-external-memory) –

답변

63

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); 
+1

클램프 메모리 사용량이 아닌 실제 저장 용량에 대해 실제로 묻습니다 (SD 카드를 언급하면서 추측합니다). – kcoppock

+0

감사합니다. 예. 기억 메모리에 대해 이야기하고 있습니다. – clamp

+1

좋은 답변입니다. 내가 볼 수 있듯이 이것은 엄격한 경고를 내 보내지 않으므로 스레드를 안전하게 보호 할 수 있습니다. 나는 그것이 파일 시스템과 관련되어 있기 때문에 엄격 모드 경고를 기대하는 절반이었다. – Mattias

9

입니다. 어떤 경로가 장치의 루트로 간주 될지 확실하지 않지만 내부 저장소의 일부인 경우 디렉토리에 관계없이 결과가 동일하다고 생각합니다. 이런 식으로 뭔가 작동 할 수 있습니다 : 다른 건 몰라도

StatFs stats = new StatFs("/data"); 
int availableBlocks = stats.getAvailableBlocks(); 
int blockSizeInBytes = stats.getBlockSize(); 
int freeSpaceInBytes = availableBlocks * blockSizeInBytes; 

는 StatFs 클래스는 당신이 볼 수있는 위치에 좋은 시작을 제공해야합니다.

+1

쿨! 나는 "/"을 위해 그것을 얻으려고 노력했다. "/ data"를 사용하면 내부 메모리가 작동합니다. –

2

내부 메모리 크기가 매우 큰 장치에서는 int 값이 너무 작기 때문에 작동하지 않습니다. 예를 들어 Motorola xum에서는 작동하지 않습니다. 당신이 뭔가를 사용해야합니다 (같은 1 메가, 1 기가 바이트) 인간이 읽을 수있는 형식에 바이트를 변환

int freeSpaceInKilobytes = availableBlocks * (blockSizeInBytes/1024);

+0

또는 int가 아닌 long 형식을 사용하십시오. –

24
/************************************************************************************************* 
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 "???"; 
    } 
+4

수학을하기 전에 blockCount와 blockSize를 long으로 형변환해야합니다. 그렇지 않은 경우, 총 블록 수와 블록 크기의 곱이 int의 최대 값을 초과하므로이 메소드는 음수 값을 반환 할 수 있습니다. 예, 코드를 사용하여 네거티브를 얻었습니다. – christophercotton

+0

@christophercotton 감사합니다! 끝난. – XXX

+7

실제로 (길게) statFs.getBlockCount() * (long) statFs.getBlockSize()를 수행하여 올바르게 캐스팅되도록해야합니다. – christophercotton

2
/** 
* @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; 
} 
5

가 2013 년부터 구글에 의해 사용되지 않는 몇 가지 방법이 있으며 이러한 방법 (API 18 세 이상 만) 변경 될 수 있습니다 :

  • getAvailableBlocks()
  • getBlockCount()getBlockCountLong()
  • getBlockSize()getAvailableBlocksLong()-getBlockSizeLong()
  • getFreeBlocks() to getFreeBlocksLong()
관련 문제