1、公共路径:所有的路径都可以访问
Environment.getDataDirectory(); // /data
Environment.getDownloadCacheDirectory(); // /cache
Environment.getExternalStorageDirectory(); // /storage/sdcard
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS); // /strorage/sdcard/Alarms
Environment.getRootDirectory(); // /system
2、私有路径:只有当前应用可以访问
getFilesDir(); // /data/data/包名/files
getCacheDir(); // /data/data/包名/cache
getExternalCacheDir(); // /storage/sdcard/Android/data/包名/cache
getExternalFilesDir(Environment.DIRECTORY_DCIM); // /storage/sdcard/Android/data/包名/files/DCIM
3、 通过反射获取存储路径
public static void getStoragePath(Context context) {
StorageManager sm = (StorageManager)context.getSystemService(Context.STORAGE_SERVICE);
try {
Object[] arrayOfObject = (Object[])sm.getClass().getMethod("getVolumeList").invoke(sm);
if ((arrayOfObject != null)){
int length = arrayOfObject.length;
for (int i = 0; i < length; i++) {
// 获取描述字段,一般为:内部共享存储空间、SD 卡、U盘(OTG)
String description = (String) arrayOfObject[i].getClass()
.getMethod("getDescription",Context.class )
.invoke(arrayOfObject[i],context);
//是否允许通过USB分享,返回值:内部共享存储空间(false)、SD 卡(true)、U盘(false)
Boolean allowMassStorage = (Boolean) arrayOfObject[i].getClass()
.getMethod("allowMassStorage")
.invoke(arrayOfObject[i]);
//是否可移除,返回值:内部共享存储空间(false)、SD 卡(true)、U盘(true)
Boolean isRemovable = (Boolean) arrayOfObject[i].getClass()
.getMethod("isRemovable")
.invoke(arrayOfObject[i]);
// 获取存储路径
String path = (String) arrayOfObject[i].getClass()
.getMethod("getPath")
.invoke(arrayOfObject[i]);
//此存储路径,是否处于挂载状态,返回值:mounted—挂载,可以使用
String volumeState = (String)sm.getClass()
.getMethod("getVolumeState", new Class[] { String.class })
.invoke(sm,new Object[] { path });
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
通过以上的 allowMassStorage 和 isRemovable 值就可以知道此得到的路径属于:内部共享存储空间、SD卡、U盘(OTG)。
并且根据volumeState可以确定此存储路径是否可用。