日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android获取手机及外设存储空间

發布時間:2023/12/20 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android获取手机及外设存储空间 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在存儲文件時,為了保證有充足的剩余空間大小,通常需要知道系統內部或者sdcard的存儲大小。下面提供一個工具類,記得是從網站搜的。

?

當下載或安裝一個文件之前,往往會比較關心當前系統內存和SD卡上的剩余容量。

在做文件拷貝,移動操作時,檢測目標目錄的空間大小也是必須的。

?

Android系統提供了Environment?和StatFs兩個類,來實現對容量的檢測。

  Environment:

    getDataDirectory():?獲取應用存儲空間文件對象。

    getExternalStorageDirectory():?獲取SD卡文件對象。

    getRootDirectory():?獲取系統空間文件對象。

  StatFs:?

    getBlockCount():?獲取存儲塊數量。

    getAvailableBlocks():?獲取存儲塊數量。

    getBlockSize():?獲取存儲塊大小。

因為Android是基于Linux系統的,所以其沒有盤符的概念,而且是以存儲塊來存儲數據。所以獲得容量的正確方式為:

  1.?通過Environment獲取需要檢測容量的文件對象。

  2.?構建StatFs對象。

  3.?獲取存儲塊數量。

  4.?獲取存儲塊大小。

  5.?計算得出容量大小。

需要注意的是,通過getBlockSize()方法獲取出來的值,是以字節做單位。

public class TestActivity extends Activity {private String TAG = "Status";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);File data = Environment.getDataDirectory();StatFs sf = new StatFs(data.getPath());int availableBlocks = sf.getAvailableBlocks();Log.d(TAG, "可用存儲塊數量:" + availableBlocks);int blockCount = sf.getBlockCount();Log.d(TAG, "總存儲塊數量:" + blockCount);int size = sf.getBlockSize();Log.d(TAG, "存儲塊大小:" + size + "字節");int totalSize = blockCount * size;Log.d(TAG, "總空間:" + totalSize + "字節");int availableSize = availableBlocks * size;Log.d(TAG, "可用空間:" + availableSize + "字節");} }

結果:

SD卡作為手機的擴展存儲設備,在手機中充當硬盤角色,可以讓我們手機存放更多的數據以及多媒體等大體積文件。因此查看SD卡的內存就跟我們查看硬盤的剩余空間一樣,是我們經常操作的一件事,那么在Android開發中,我們如何能獲取SD卡的內存容量呢?

1.要獲取SD卡上面的信息,必須先對SD卡有訪問的權限,因此第一件事就是需要添加訪問擴展設備的權限.

<!-- 在SDCard中創建與刪除文件權限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 往SDCard寫入數據權限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2.需要判斷手機上面SD卡是否插好,如果有SD卡的情況下,我們才可以訪問得到并獲取到它的相關信息.

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))

3.取得sdcard文件路徑

File path = Environment.getExternalStorageDirectory(); StatFs statfs = new StatFs(path.getPath());

4.獲取block的SIZE

long blocSize = statfs.getBlockSize();

5.獲取BLOCK數量

long totalBlocks = statfs.getBlockCount();

6.空閑的Block的數量

long availaBlock = statfs.getAvailableBlocks();

7.計算總空間大小和空閑的空間大小

public long getAvailaleSize(){File path = Environment.getExternalStorageDirectory(); //取得sdcard文件路徑StatFs stat = new StatFs(path.getPath());   long blockSize = stat.getBlockSize();   long availableBlocks = stat.getAvailableBlocks();   return availableBlocks * blockSize; //(availableBlocks * blockSize)/1024 KIB 單位//(availableBlocks * blockSize)/1024 /1024 MIB單位 }
public long getAllSize(){File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize();   long availableBlocks = stat.getBlockCount();   return availableBlocks * blockSize; }

?

存儲容量檢測?注意構建StatFs對象的參數合法性

LogCat?報錯信息:

02-14?10:24:27.134:?ERROR/(4355):?statfs?nokia?failed,?errno:?2??

02-14?10:24:27.144:?WARN/System.err(4355):?java.lang.IllegalArgumentException??

02-14?10:24:27.153:?WARN/System.err(4355):?at?android.os.StatFs.native_setup(Native?Method)??

02-14?10:24:27.173:?WARN/System.err(4355):?at?android.os.StatFs.(StatFs.java:32)??

02-14?10:24:27.173:?WARN/System.err(4355):?at?com.tmall.util.Devices.getBlock(Devices.java:161)??

02-14?10:24:27.184:?WARN/System.err(4355):?at?com.tmall.util.Devices.getUsedRatio(Devices.java:199)??

02-14?10:24:27.184:?WARN/System.err(4355):?at?com.tmall.nokia.Check.checkSDBlock(Check.java:271)??

02-14?10:24:27.184:?WARN/System.err(4355):?at?com.tmall.nokia.Check.run(Check.java:332)??

02-14?10:24:27.195:?WARN/System.err(4355):?at?java.lang.Thread.run(Thread.java:1019)??

發生錯誤原因分析:
分析發生錯誤部分代碼,發現在構建StatFs對象時出錯

nokiaPath?=?"nokia"??

StatFs?sf?=?new?StatFs(nokiaPath);??

StatFs用于對系統的存儲容量進行檢測。報錯是因為構建StatFs對象時使用了非法參數。"nokia"不是一個合法有效的參數,合法參數應該形如"sdcard"。

?

解決辦法:

使用默認的路徑及名稱是最好的方法

nokiaPath?=?Environment.getExternalStorageDirectory().getPath();//?nokiaPath?="/mnt/sdcard"??

//nokiaPath?=?Environment.getExternalStorageDirectory().getName();//?nokiaPath?="sdcard"??

StatFs?sf?=?new?StatFs(nokiaPath);??

如果一定需要自定義路徑作為參數,也應使用類似下列格式的有效自定義路徑

nokiaPath?=?"/mnt/sdcard/nokia/";??

nokiaPath?=?"/sdcard/nokia/";??

nokiaPath?=?"sdcard/nokia/";??

?

以合法的路徑及名稱作為參數,一般類似以"/mnt/sdcard"?或"sdcard/"開頭的路徑都是正確的。針對不同硬件,可能需要在編程中通過測試,使用有效格式。

轉載于:https://www.cnblogs.com/liyuejiao/p/4257140.html

總結

以上是生活随笔為你收集整理的Android获取手机及外设存储空间的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。