Android7.1 获取U盘路径

本文详细介绍了Android设备的内部存储和外部存储的区别,以及如何使用API进行文件操作。特别强调了如何通过反射机制获取外部存储如U盘的路径,避免依赖广播接收器。代码示例展示了利用VolumeInfo类获取所有可读取的存储设备路径的方法。
摘要由CSDN通过智能技术生成

我们都知道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;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值