標籤:android style blog class code java
轉:http://blog.csdn.net/zhandoushi1982/article/details/8560233
擷取android檔案系統的資訊,需要Environment類和StatFs類的支援。
(1)Environment 是一個提供訪問環境變數的類,常用的方法有:
A,getRootDirectory() ,返回File,擷取Android 的根目錄。
B,getDataDirectory() ,返回File ,擷取Android 資料目錄。
C,getExternalStorageDirectory() ,返回File ,擷取外部儲存目錄即SDCard。
D,getExternalStorageState() ,返回String,擷取外部存放裝置的目前狀態字串。
E,getDownloadCacheDirectory(),返回File ,擷取Android 下載/緩衝內容目錄。
常用的字串變數,以getExternalStorageState傳回值為例:
A,MEDIA_BAD_REMOVAL,表明SDCard 被卸載前己被移除。
B,MEDIA_CHECKING,表明對象正在磁碟檢查。
C,MEDIA_MOUNTED,表明對象存在並具有讀/寫入權限。
D,MEDIA_MOUNTED_READ_ONLY,表明對象許可權為唯讀。
E,MEDIA_NOFS,表明對象為空白或正在使用不受支援的檔案系統。
F,MEDIA_REMOVED,不存在SDCard。
G,MEDIA_SHARED,表明儲存媒體正在通過USB共用,比如手機通過資料線串連到手機後就是這種狀態,此時APP不能擷取到儲存媒體上的資料。
H,MEDIA_UNMOUNTABLE,表明儲存媒體無法掛載。
I, MEDIA_UNMOUNTED,表明儲存媒體沒有掛載。
(2)StatFs類,一個類比linux的df命令的類,成員函數是獲得底層Linux檔案系統的屬性函數。StatFs 常用方法:
A,getAvailableBlocks(),返回Int,擷取當前系統可用儲存空間的Block數。
B,getBlockCount(),返回Int,擷取當前系統儲存空間總的Block數。
C,getBlockSize(),返回Int ,擷取當前系統Block占的大小,以位元組為單位
D,getFreeBlocks(),返回Int ,該塊地區剩餘的空間(包括可用空間和保留空間)。
(3)一個擷取系統和SD卡可用容量及總總量的執行個體,如下:
import android.os.Environment;import android.os.StatFs;import java.io.File;public long getAvailableInternalMemorySize(){ File path = Environment.getDataDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); return availableBlocks*blockSize;} public long getTotalInternalMemorySize(){ File path = Environment.getDataDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long totalBlocks = stat.getBlockCount(); return totalBlocks*blockSize;} public boolean externalMemoryAvailable(){ return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);} public long getAvailableExternalMemorySize(){ if(externalMemoryAvailable()){ File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); return availableBlocks*blockSize; } else{ return -1; }} public long getTotalExternalMemorySize(){ if(externalMemoryAvailable()){ File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long totalBlocks = stat.getBlockCount(); return totalBlocks*blockSize; } else{ return -1; }}
從LOG輸出資料即可,以M為單位。
Log.i("zhangcheng","內部可用儲存空間是:"+Long.toString(getAvailableInternalMemorySize()/(1024*1024))); Log.i("zhangcheng","內部總共儲存空間是:"+Long.toString(getTotalInternalMemorySize()/(1024*1024))); Log.i("zhangcheng","外部可用儲存空間是:"+Long.toString(getAvailableExternalMemorySize()/(1024*1024))); Log.i("zhangcheng","外部總共儲存空間是:"+Long.toString(getTotalExternalMemorySize()/(1024*1024)));
(4)需要注意的是,訪問儲存空間檔案系統,也需要在XML中添加許可權,如下:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
==========================================================================================================
有些應用能安裝到SD卡上,有些不能,這其中有一定規則。如何判斷?
Google 預設 PackageManager 管理安裝包的機制如下:在 AdroidManifest.xml 裡面定義安裝位置可以有四種情況:
1. 如果沒有定義安裝位置,表示安裝在手機記憶體上;
2. android:installLocation = "auto",表示先查看手機記憶體是否足夠,如果夠就安裝在手機記憶體上,不夠就安裝在 T 卡上;
3. android:installLocation = "internalOnly",表示安裝在手機記憶體上;
4. android:installLocation = "preferExternal" ,表示安裝在 T 卡上;
如果 apk 的 AndroidManifest.xml 裡面定義 android:installLocation = "internalOnly",那麼無論使用者選擇安裝在什麼地方,該apk 都會安裝到手機上,這樣做的好處是避免程式運行錯誤,因為定義android:installLocation = "internalOnly" 的 apk 一般要安裝到手機記憶體上才能正常運行。