1. 程式人生 > >android 獲取儲存空間大小

android 獲取儲存空間大小

android手機上面的儲存空間主要有手機本身的儲存空間和SD卡的儲存空間。之前用的最多的是SD卡的儲存空間,在總結的時候看了一下系統的原始碼,很有收穫。在手機安裝應用時,系統會自動在/data/data目錄下面以應用的主包名建立一個目錄,預設還會在最後的那個目錄裡面建立一個lib目錄。下面看一下獲取儲存空間的程式碼:

  1. import android.os.Environment;  
  2. import android.os.StatFs;  
  3. /** 
  4.  * 儲存空間管理 
  5.  * 
  6.  */
  7. publicclass MemorySpaceCheck  
  8. {  
  9.     /** 
  10.      * 計算剩餘空間
     
  11.      * @param path 
  12.      * @return 
  13.      */
  14.     privatestaticlong getAvailableSize(String path)  
  15.     {  
  16.         StatFs fileStats = new StatFs(path);  
  17.         fileStats.restat(path);  
  18.         return (long) fileStats.getAvailableBlocks() * fileStats.getBlockSize(); // 注意與fileStats.getFreeBlocks()的區別
  19.     }  
  20.     /** 
  21.      * 計算總空間 
  22.      * @param path 
  23.      * @return 
  24.      */
  25.     privatestaticlong getTotalSize(String path)  
  26.     {  
  27.         StatFs fileStats = new StatFs(path);  
  28.         fileStats.restat(path);  
  29.         return (long) fileStats.getBlockCount() * fileStats.getBlockSize();  
  30.     }  
  31.     /**
     
  32.      * 計算SD卡的剩餘空間 
  33.      * @return 剩餘空間 
  34.      */
  35.     publicstaticlong getSDAvailableSize()  
  36.     {  
  37.         if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))  
  38.         {  
  39.             return getAvailableSize(Environment.getExternalStorageDirectory().toString());  
  40.         }  
  41.         return0;  
  42.     }  
  43.     /** 
  44.      * 計算系統的剩餘空間 
  45.      * @return 剩餘空間 
  46.      */
  47.     publicstaticlong getSystemAvailableSize()  
  48.     {  
  49.         // context.getFilesDir().getAbsolutePath();
  50.         return getAvailableSize("/data");  
  51.     }  
  52.     /** 
  53.      * 是否有足夠的空間 
  54.      * @param filePath 檔案路徑,不是目錄的路徑 
  55.      * @return 
  56.      */
  57.     publicstaticboolean hasEnoughMemory(String filePath)  
  58.     {  
  59.         File file = new File(filePath);  
  60.         long length = file.length();  
  61.         if (filePath.startsWith("/sdcard") || filePath.startsWith("/mnt/sdcard"))  
  62.         {  
  63.             return getSDAvailableSize() > length;  
  64.         }  
  65.         else
  66.         {  
  67.             return getSystemAvailableSize() > length;  
  68.         }  
  69.     }  
  70.     /** 
  71.      * 獲取SD卡的總空間 
  72.      * @return 
  73.      */
  74.     publicstaticlong getSDTotalSize()  
  75.     {  
  76.         if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))  
  77.         {  
  78.             return getTotalSize(Environment.getExternalStorageDirectory().toString());  
  79.         }  
  80.         return0;  
  81.     }  
  82.     /** 
  83.      * 獲取系統可讀寫的總空間 
  84.      * @return 
  85.      */
  86.     publicstaticlong getSysTotalSize()  
  87.     {  
  88.         return getTotalSize("/data");  
  89.     }  
  90. }  
  91. 如果想要在系統的儲存空間中寫入資料,可以用context.getFilesDir().getAbsolutePath(),獲取該應用的可寫目錄,也就是/data/data/應用主包名/files目錄,可以往裡面寫入資料,在應用被解除安裝時,也一併被刪除,不用擔心會產生垃圾,非常給力。