Android6.0系统插入外部SD卡时,会在storage/下自动生成一个随机目录,因此不能像之前那样直接把外部存储路径写成"/mnt/sdcard/"的形式,下面两种方法可以动态获取到外部存储路径。
方法一、
public static String getsdcardPath(){
StorageManager mStorageManager = StorageManager.from(DRVApp.getContext());
final List<VolumeInfo> vols = mStorageManager.getVolumes();
VolumeInfo sdcardVolume = null ;
for(VolumeInfo vol : vols){
if(vol.getDisk() != null && vol.getDisk().isSd()){
sdcardVolume = vol;
}
}
String sdcardPath = null;
if(sdcardVolume!= null) {
sdcardPath = sdcardVolume.getPath()==null ? null :sdcardVolume.getPath().toString();
String sdcardState = sdcardVolume.getEnvironmentForState(sdcardVolume.getState());
if(sdcardState.equals(Environment.MEDIA_MOUNTED)){
if (sdcardPath != null) {
}else{
Log.d("wanghong", "null");
}
}else{
sdcardPath = null;
}
}
方法二、
String path1 = getStoragePath(mContext, true);// true:外置 false:内置
private static String getStoragePath(Context mContext, boolean is_removale) {
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);
final int length = Array.getLength(result);
for (int i = 0; i < length; i++) {
Object storageVolumeElement = Array.get(result, i);
String path = (String) getPath.invoke(storageVolumeElement);
boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
if (is_removale == removable) {
return path;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}