2011-01-04 13 views
37

Có thể nhận được lượng bộ nhớ trống trên thiết bị Android (không phải trên thẻ SD) thông qua SDK Android không?Nhận dung lượng trống trên bộ nhớ trong

Nếu có, làm cách nào?

+2

Bản sao có thể có của [Android nhận được kích thước bộ nhớ trong/bộ nhớ ngoài miễn phí] (https://stackoverflow.com/questions/8133417/android-get-free-size-of-internal-external-memory) –

Trả lời

63

this bài đăng có thể phù hợp với câu hỏi của bạn.

cũng kiểm tra this thread. có rất nhiều thông tin ở đây trên SO.

googled một chút và đây là giải pháp (tìm thấy tại 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

Tôi tin rằng kẹp thực sự hỏi về lưu trữ thực tế, không sử dụng bộ nhớ (tôi suy ra điều này từ việc đề cập đến Thẻ SD). – kcoppock

+0

cảm ơn, vâng tôi đang nói về bộ nhớ lưu trữ. – clamp

+1

Câu trả lời hay. Từ những gì tôi có thể thấy, điều này không mang lại bất kỳ cảnh báo nghiêm ngặt nào, làm cho nó trở thành chủ đề chính an toàn. Tôi đã được một nửa mong đợi một cảnh báo chế độ nghiêm ngặt vì nó là hệ thống tập tin liên quan. – Mattias

9

Dường như lớp StatFs có thể là những gì bạn cần phải sử dụng. Tôi không chắc chắn con đường nào sẽ được coi là gốc của thiết bị, nhưng tôi tin rằng kết quả sẽ giống nhau bất kể thư mục, miễn là nó là một phần của bộ nhớ trong. Một cái gì đó như thế này có thể hoạt động:

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

Nếu không có gì khác, lớp StatFs sẽ cho bạn một khởi đầu tốt về nơi cần tìm.

+1

Tuyệt! Tôi đã cố gắng để có được nó cho "/" mà không hoạt động. Sử dụng "/ data" hoạt động cho bộ nhớ trong. –

2

Trên các thiết bị có kích thước bộ nhớ trong rất lớn, nó không hoạt động vì giá trị int quá nhỏ. Ví dụ trên Motorola xum nó không hoạt động. Bạn phải sử dụng một cái gì đó như thế này:

int freeSpaceInKilobytes = availableBlocks * (blockSizeInBytes/1024);

+0

Hoặc sử dụng loại dài, không phải int. –

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; 
    } 

Chuyển đổi byte sang định dạng có thể đọc được con người (như 1 Mb, 1 Gb)

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

Bạn cần phải bỏ blockCount và blockSize vào một thời gian dài trước khi thực hiện phép toán. Nếu không, các phương pháp này có thể trả về giá trị âm, vì tổng số lần khối lần khối kích thước sẽ vượt quá giá trị lớn nhất cho một int. Có, tôi đã sử dụng mã và nhận được âm bản. – christophercotton

+0

@christophercotton Cảm ơn! Làm xong. – XXX

+7

Bạn sẽ thực sự cần phải làm (dài) statFs.getBlockCount() * (long) statFs.getBlockSize() để đảm bảo chúng được truyền chính xác. – 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

Có một số phương pháp đã được tán thành bởi Google kể từ năm 2013 và bạn có thể thay đổi các phương pháp (API 18+ only):

  • getAvailableBlocks() để getAvailableBlocksLong()
  • getBlockCount() để getBlockCountLong()
  • getBlockSize()-getBlockSizeLong()
  • getFreeBlocks() tới getFreeBlocksLong()