Android 5.1 & 6.0 访问Sdcard以及U盘总结

# Android 5.1 & 6.0 访问Sdcard以及U盘总结

SaraYang
2017-4-25


Android 5.1 访问 Sdcard 和 U盘 的过程

首先是sdcard的访问路径说明:
在Android 5.1中,根据特定开发版本的配置,Sdcard的挂载在/storage/extsdcard/中;
所以Sdcard的访问路径可以固定在该路径下;

其次是USB的访问路径,USB挂载在路径/storage/usb_storage目录下;
所以此时需要遍历/storage/usb_storage路径下的所有文件,即可以得到usb的路径;
因为usb的插口不止一个,所以可能同时挂载多个u盘
示例代码如下:
例如找寻放在u盘中的ota.conf文件;

String filePath = "/storage/usb_storage";
File f = new File(filePath);
File[] files = f.listFiles();
for (int i = 0; i < files.length; i++) {
    String path = filePath + "/" + files[i].getName() + "/ota.conf";
}

但是这里要强调的是,Android 5.1原生系统中,Sdcard或者Usb的访问路径可能不是在这里; 这里说到的访问路径,和特定的开发板有关系;

Android 6.0 访问 Sdcard 和 U盘 的过程

Android 6.0中访问SDcard或者USB是通过StorageManager来实现的;
1. 获取到StorageManager对象,通过Context对象获取到,如下所示:

Context mContext;
StorageManager mStorageManger = mContext.getSystemService(StorageManager.class);
  1. 获取系统中所有的盘卡信息,例如内置Sdcard,插入的sdcard或者U盘,如下所示:
final List<VolumeInfo> vols = mStorageManager.getVolumes();

VolumeInfo是一个数据包类,记录了盘卡所有的信息,包括路径,类型,以及label等等;所以接下来就是遍历获取到的vols
3. 遍历vols,找出U盘以及Sdcard设备的对象;
u盘或者sdcard,它们的特征是,type为PUBLIC,且只有在其状态为Mounted时,才可以获取其路径;

final List<VolumeInfo> vols = mStorageManager.getVolumes();
String path;
for (VolumeInfo vol : vols) {
    System.out.println("volumenInfo is " + vol.toString());
    if (vol.getType() == VolumeInfo.TYPE_PUBLIC && vol.getState() == VolumeInfo.STATE_MOUNTED) {
        DiskInfo disk = vol.getDisk();
        if (disk.isSd() || disk.isUsb()) {
            path = vol.path;
            System.out.println("sdcard or USB path is " + path);
        }
    }
}

DiskInfo也是记录磁盘信息的数据类; 其中可以通过其接口函数isSd()判断是否为sdcard,通过isUsb()判断是否为USB;
同时可以通过VolumeInfo中的接口toString得知volume相关的其他数据;
例如:
04-25 02:47:25.882 I/OTA( 2312): volume is public, vol is VolumeInfo{public:8:1}:
04-25 02:47:25.882 I/OTA( 2312): type=PUBLIC diskId=disk:8,0 partGuid=null mountFlags=VISIBLE mountUserId=0
04-25 02:47:25.882 I/OTA( 2312): state=MOUNTED
04-25 02:47:25.882 I/OTA( 2312): fsType=vfat fsUuid=ADFE-0A0B fsLabel=
04-25 02:47:25.882 I/OTA( 2312): path=/storage/ADFE-0A0B internalPath=/mnt/media_rw/ADFE-0A0B

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值