我们都知道android开发难免的要对存储设备进行一些操作,最常见的就是读取文件,存储文件了,今天来具体说说android存储相关的知识,
安卓设备呢,存储分为内部存储和外部存储,内部存储顾名思义就是安卓设备自带的存储器即Sdcard,系统提供了通用api来获取这个存储路径,如下图,在根目录下创建一个文件夹和log.txt文件,
当然上图操作是在程序已经获取到读写操作权限才可以正确使用的,这里不做过多阐述.这里操作的内部存储,如果要对外部存储U盘来进行读写操作呢? 这时候大家都会想到是不是也可以通过Environment来获取呢?很遗憾,这是获取不到的.还有人会说通过插拔广播来获取,只需要注册挂载广播IntentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);然后在广播里可以通过Intent.getData().getPath()也是可以获取到U盘的路径的,但是,但是来了,如果不想通过广播来获取,有没有办法呢?
当然有,现在就介绍下任何情况下,都能正确获取U盘路径的办法,大致就是通过java的反射机制来通过VolumeInfo获取的,如下代码片段
/** * 获取U盘路径 * @return */ private List<String> getUsbDrivePath(){ List<String> allPath = new ArrayList<>(); StorageManager mStorageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE); Class<?> volumeInfoClazz = null; Method getVolumes = null; Method isMountedReadable = null; Method getType = null; Method getPath = null; List<?> volumes = null; try { volumeInfoClazz = Class.forName("android.os.storage.VolumeInfo"); getVolumes = StorageManager.class.getMethod("getVolumes"); isMountedReadable = volumeInfoClazz.getMethod("isMountedReadable"); getType = volumeInfoClazz.getMethod("getType"); getPath = volumeInfoClazz.getMethod("getPath"); volumes = (List<?>) getVolumes.invoke(mStorageManager); if (volumes.size() == 0) { return null; } for (Object vol : volumes) { if (vol != null && (boolean) isMountedReadable.invoke(vol) && (int) getType.invoke(vol) == 0) { File path2 = (File) getPath.invoke(vol); String p2 = path2.getPath(); allPath.add(p2); } } } catch (Exception ex) { ex.printStackTrace(); } return null; }