真機環境下如何獲取內部存儲路徑和外置SD卡路徑。
打開文件管理器可以看到兩個目錄,分別是內部存儲 /storage/emulated/0 和外置SD卡路徑 /storage/9EBB-17EE
其中內部存儲根路徑,可直接通過 Environment.getExternalStorageDirectory() 獲取。
外置SD卡路徑 需要通過反射獲取,代碼如下
/** * 通過反射調用獲取內置存儲和外置sd卡根路徑(通用) * * @param mContext 上下文 * @param is_removale 是否可移除,false返回內部存儲路徑,true返回外置SD卡路徑 * @return
*/
private static String getStoragePath(Context mContext, boolean is_removale) { String path = ""; //使用getSystemService(String)檢索一個StorageManager用於訪問系統存儲功能。 StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE); Class<?> storageVolumeClazz = null; try { storageVolumeClazz = Class.forName("android.os.storage.StorageVolume"); Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList"); Method getPath = storageVolumeClazz.getMethod("getPath"); Method isRemovable = storageVolumeClazz.getMethod("isRemovable"); Object result = getVolumeList.invoke(mStorageManager); for (int i = 0; i < Array.getLength(result); i++) { Object storageVolumeElement = Array.get(result, i); path = (String) getPath.invoke(storageVolumeElement); boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement); if (is_removale == removable) { return path; } } } catch (Exception e) { e.printStackTrace(); } return path; }
效果如下