有獲取外部SD卡存儲空間的需求,可是某度出來的方法都千篇一概採用Environment類的getExternalStorageDirectory方法,可是此方法Deprecated。因此只能用其餘方式。java
獲取StorageManager的實例測試
storageManager = (StorageManager)mContext.getSystemService(mContext.STORAGE_SERVICE);
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; }
返回掛載的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; }
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; }
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; }