擷取android手機內部儲存空間和外部儲存空間的參數 && 如何決定一個apk的安裝位置

來源:互聯網
上載者:User

標籤: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 一般要安裝到手機記憶體上才能正常運行。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.