1、android的sd卡的分类 内置sd卡,外置sd卡,内置sd卡并非android的机身存储,android的机身存储包含外置sd卡,而外置sd卡又分为机身外置存储,挂载的sd卡存储,其中Environment.getExternalStorageDirectory() 方法获取到的是android中机身的外置sd卡路径
2、如果我们要操作android挂载的sd卡并且在挂载的sd卡上读写文件就需要我们使用反射获取到挂载sd卡的路径,获取挂载sd卡路径的方法
public static String getStoragePath(Context pContext) {
final StorageManager storageManager = (StorageManager) pContext.getSystemService(Context.STORAGE_SERVICE);
try {
//得到StorageManager中的getVolumeList()方法的对象
final Method getVolumeList = storageManager.getClass().getMethod("getVolumeList");
//---------------------------------------------------------------------
//得到StorageVolume类的对象
final Class<?> storageValumeClazz = Class.forName("android.os.storage.StorageVolume");
//---------------------------------------------------------------------
//获得StorageVolume中的一些方法
final Method getPath = storageValumeClazz.getMethod("getPath");
Method isRemovable = storageValumeClazz.getMethod("isRemovable");
Method mGetState = null;
//getState 方法是在4.4_r1之后的版本加的,之前版本(含4.4_r1)没有
// (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/android/os/Environment.java/)
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
try {
mGetState = storageValumeClazz.getMethod("getState");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
//---------------------------------------------------------------------
//调用getVolumeList方法,参数为:“谁”中调用这个方法
final Object invokeVolumeList = getVolumeList.invoke(storageManager);
//---------------------------------------------------------------------
final int length = Array.getLength(invokeVolumeList);
for (int i = 0; i < length; i++) {
final Object storageValume = Array.get(invokeVolumeList, i);//得StorageVolum对象
final String path = (String) getPath.invoke(storageValume);
final boolean removable = (Boolean) isRemovable.invoke(storageValume);
if (mGetState != null) {
if (removable){
return path;
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
3、对于挂载SD卡的读写操作仅限于有限的目录,要写入文件只能卸载.../android/包名/下边
4、注意:在对挂载的sd卡进行写入之前必须调用context.getExternalFilesDirs(Environment.DIRECTORY_PICTURES);方法穿件文件,建议在application中调用,方法中传入的参数,具体可以查看源码