真机环境下如何获取内部存储路径和外置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;}
效果如下
Demo 地址:https://github.com/wgitgame/SDDemo