Android獲取SD卡存儲空間

前言

有獲取外部SD卡存儲空間的需求,可是某度出來的方法都千篇一概採用Environment類的getExternalStorageDirectory方法,可是此方法Deprecated。因此只能用其餘方式。java

1.StorageManager

獲取StorageManager的實例測試

storageManager = (StorageManager)mContext.getSystemService(mContext.STORAGE_SERVICE); 

2.獲取存儲卡路徑

private String[] getExtSDCardPath() { Log.d("SDRemount ","getExtSDCardPath"); try { Class<?>[] paramClasses = {}; Method getVolumePathsMethod = StorageManager.class.getMethod("getVolumePaths", paramClasses); getVolumePathsMethod.setAccessible(true); Object[] params = {}; Object invoke = getVolumePathsMethod.invoke(storageManager, params); return (String[])invoke; } catch (NoSuchMethodException e1) { e1.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } 

3.檢查掛載

返回掛載的SD卡路徑,經屢次測試,上一步獲取到的路徑全都爲掛載的。其中第一個路徑爲:/storage/emulated/0,其爲自己內部存儲。因此當返回的路徑個數大於1時,存在外部存儲。spa

public String[] sdCardRemounted() { Log.d("SDRemount ","sdCardRemounted checked"); String[] data = getExtSDCardPath(); List<String> list =new ArrayList<>(); if (data.length > 0){ for(String path : data){ if(checkMounted(mContext,path)){ list.add(path); } } } int count = list.size(); String[] result =new String[count]; /*for (int i = 0;i < count; i++) { result[i]=list.get(i); }*/ return list.toArray(result); } 

檢查掛載:code

private boolean checkMounted(Context context, String mountPoint) { if (mountPoint == null) { Log.d("SDRemount ","mountPoint == null"); return false; } //StorageManager storageManager = (StorageManager) context //.getSystemService(Context.STORAGE_SERVICE); try { Method getVolumeState = storageManager.getClass().getMethod( "getVolumeState", String.class); String state = (String) getVolumeState.invoke(storageManager, mountPoint); //Log.d("SDRemount ","SDCard path " + mountPoint +" and state " +state); StatFs statFs = new StatFs(mountPoint); long blockSize=statFs.getBlockSizeLong(); long availableSize=statFs.getAvailableBlocksLong(); long totalSize=statFs.getBlockCountLong(); Log.d("SDRemount ","SDCard path " + mountPoint +" and state " +state + " total size "+ totalSize*blockSize + " available size " + availableSize*blockSize); return Environment.MEDIA_MOUNTED.equals(state); } catch (Exception e) { e.printStackTrace(); } return false; } 

4.根據路徑獲取存儲空間

4.1 所有空間

public long getTotalSize(String path){ StatFs statFs = new StatFs(path); long blockSize=statFs.getBlockSizeLong(); //long availableSize=statFs.getAvailableBlocksLong(); long totalSize=statFs.getBlockCountLong(); long total = blockSize * totalSize; Log.d("SDRemount ","SDCard path " + path +" total size "+ total); return total; } 

4.2 可用空間

public long getAvailableSize(String path){ StatFs statFs = new StatFs(path); long blockSize=statFs.getBlockSizeLong(); long availableSize=statFs.getAvailableBlocksLong(); //long totalSize=statFs.getBlockCountLong(); long total = blockSize * availableSize; Log.d("SDRemount ","SDCard path " + path +" total size "+ total); return total; }
相關文章
相關標籤/搜索