写过这个功能的童鞋应该很理解我,当初找了大量的资料也只能做到在两者都插入时分辨出哪个是哪个,只插入其中一方,则一脸无奈,当初我甚至在界面上写"检测U盘或SD卡插入,总容量为xx,可用容量为xx"这样的,特别尬.

现在又要写这个功能,而且是分成两个模块的,USB检测就只检测插入的U盘的容量(有三个U盘),SD卡检测就只检测插入的SD卡的容量.再用之前这种方法肯定是混不过去的了,没办法,一步步来解决吧.

首先要解决分辨USB和SD的问题,之所以难分辨是因为Android自动挂载U盘和SD卡的路径是相同的,都是在/storage/目录下,而SD卡和U盘的挂载名称五花八门,千奇百怪,如68EE-C662,9E20-8ACD,8624266024265389,我突然发现是可以根据名称来的啊,看我列举的这三个名称,前两个是U盘的,后面全数字的是SD卡,如果系统规则规定是这样的话,那确实是可以的哈.

我找到的是另一种,不太懂的话通过Log看输出,你就明白了,第二个参数建议"U"或"SD",分别表示U盘,SD卡

public static String getStoragePath(Context mContext,String keyword) {String targetpath = "";StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);Class<?> storageVolumeClazz = null;try {storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");Method getPath = storageVolumeClazz.getMethod("getPath");Object result = getVolumeList.invoke(mStorageManager);final int length = Array.getLength(result);Method getUserLabel = storageVolumeClazz.getMethod("getUserLabel");for (int i = 0; i < length; i++) {Object storageVolumeElement = Array.get(result, i);String userLabel = (String) getUserLabel.invoke(storageVolumeElement);String path = (String) getPath.invoke(storageVolumeElement);//Log.d("zdd",userLabel);if(userLabel.contains(keyword)){targetpath = path;}//Log.d("zdd", "usb路徑為"+targetpath);}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return targetpath ;}

然后再来个简单的判断

String sdMntPath = tUtils.getStoragePath(SdCardTestActivity.this, "SD");String sdContainer = getSDContainer(SdCardTestActivity.this, sdMntPath);if (sdMntPath=="") {text = "未检测到外置SD卡";}else {text = "SD卡挂载路径为"+sdMntPath+"\n"+"SD卡"+sdContainer;}

主要是上面提到的那个静态函数,注意static不能丢.

这样就能分辨出SD卡和U盘了,但是经过我的测试只能得到一个U盘的插拔状态,想多测几个就直接崩溃,原因未知.

现在问题就变成了,该怎么测试多个U盘的插拔状态.

其实这个不难,因为之前一直是被无法区分U盘和SD卡给难住的.

思路是:

遍历/storage/目录

得到一个String数组,第一个元素是emulated/0,这个不插U盘和SD卡也会存在的,

然后第二个元素如果插了SD卡,就是SD卡的名称,如果没插SD卡,就是U盘的名称.

这么说明白了吧,只要插了SD卡,它就在第二个元素的位置,不离不弃.

所以我们先通过上面提到的函数检测是否插入了SD卡,没插入的话,除了emulated/0之外的元素都是U盘,有几个就表示插入了几个U盘,插入了的话,不用我说,你也能明白吧.

String text = null;boolean isSdExixt = tUtils.getStoragePath(UsbTestActivity.this, "SD")=="";//myLog(String.valueOf(isSdExixt));String[] list = getFunc();//myLog(String.valueOf(list.length));switch (list.length) {case 1://SD卡和USB均未插入text = "未检测到U盘";break;case 2:if (!isSdExixt) {//只插入SD卡text = "未检测到U盘";}else {//插入一个U盘 路径为 list[1]text = "U盘1号"+getUSBContainer(UsbTestActivity.this, list[1]);}break;case 3:if (!isSdExixt) {//插入SD卡和一个U盘 路径为list[2]text = "U盘1号"+getUSBContainer(UsbTestActivity.this, list[2]);}else {//插入两个U盘  路径分别为list[1]和list[2]text = "U盘1号"+getUSBContainer(UsbTestActivity.this, list[1])+"\n"+"U盘2号"+getUSBContainer(UsbTestActivity.this, list[2]);}break;case 4:if (!isSdExixt) {//插入SD卡和两个U盘  路径分别为list[2]和list[3]text = "U盘1号"+getUSBContainer(UsbTestActivity.this, list[2])+"\n"+"U盘2号"+getUSBContainer(UsbTestActivity.this, list[3]);}else {//插入三个U盘  路径分别为list[1],list[2]和list[3]text = "U盘1号"+getUSBContainer(UsbTestActivity.this, list[1])+"\n"+"U盘2号"+getUSBContainer(UsbTestActivity.this, list[2])+"\n"+"U盘3号"+getUSBContainer(UsbTestActivity.this, list[3]);}break;case 5://插入SD卡和三个U盘 路径分别为list[2],list[3]和list[4]text = "U盘1号"+getUSBContainer(UsbTestActivity.this, list[2])+"\n"+"U盘2号"+getUSBContainer(UsbTestActivity.this, list[3])+"\n"+"U盘3号"+getUSBContainer(UsbTestActivity.this, list[4]);break;default:break;}txtShowUSBInfo.setText(text);

好了,就这些了.

Android区分SD卡和U盘相关推荐

  1. android u盘自动挂载点,Android2.3实现SD卡与U盘自动挂载的方法

    本文实例讲述了Android2.3实现SD卡与U盘自动挂载的方法.分享给大家供大家参考,具体如下: 在 s3c6410平台上移植android2.3 过程中SD卡总是不能自动挂载. 查阅相关资料,知道 ...

  2. android u盘挂载监听,Android SD卡及U盘插拔状态监听及内容读取

    本篇是通过系统方法来对sd卡及U盘插拔监听及数据获取,Android盒子端开发,有系统权限,当然,这个比较简单,知道具体方法,可以通过反射来实现. 先贴上效果图: 获取外置存储设备并监听插拔状态 获取 ...

  3. Android SD卡及U盘插拔状态监听和内容读取

    本篇是通过系统方法来对sd卡及U盘插拔监听及数据获取,Android盒子端开发,有系统权限,当然,这个比较简单,知道具体方法,可以通过反射来实现. 先贴上效果图: 获取外置存储设备并监听插拔状态 获取 ...

  4. Android文件系统管理——版本内外存所指差异,获得外接SD/U盘路径,在SD卡与U盘间传送文件,两天辛酸泪,收藏不迷路

    在开发一个文件管理系统的路上,总有坑在等着你. 前情提示:因为该系统的使用方需要严格保密文件,导致它失去了无线传输功能,只能通过外设传输文件. 在没接触这个功能之前,我想大家应该都觉得手机自带的存储空 ...

  5. Android 判断SD卡是否存在及容量查询

    转载:http://blog.csdn.net/xinzheng_wang/article/details/7827775 Android 判断SD卡是否存在及容量查询的简单方法如下: 首先要在And ...

  6. Android 获取SD卡路径和判断SD卡是否存在.

    android获取sd卡路径方法: public String getSDPath(){ File sdDir = null; boolean sdCardExist =Environment.get ...

  7. 2019 SD卡、U盘无法格式化怎么办的解决方法

    有天 闲的没事, 格式化一下U盘 ,结果突然断电了,我的天.我还在格式化的U盘 ,果然 ,我在此启动电脑后,的U盘直接 就不能用了.于是 我格式化. 然后,我的U盘就怎么也格式化不好了 ,找到了几种解 ...

  8. 手机sd卡恢复工具android版,SD卡数据恢复软件

    SD卡数据恢复软件,SD卡文件数据恢复工具(内存卡数据恢复)是一款功能强大.体积小巧.操作简便的SD卡数据恢复软件,可恢复SD卡上因各种原因导致丢失的文件.增加了预览功能.有需要的用户赶紧来下载试试看 ...

  9. ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能)

    ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能) 之所以写裸机,也就是没有操作系统的实现方法是因为linux系统下的实现方法网上已经有很多了,之前使用的STM32实 ...

最新文章

  1. WinServer2012中怎样设置静态IP
  2. LeetCode——贪心思想
  3. ESP8266在Alios-Things上的入门开发指南 (一)开发环境搭建及HelloWorld固件
  4. 5-10多分支网络结构
  5. 大数据架构师工作内容有哪些?
  6. Dev TreeList常用用法
  7. 万象物语找回服务器,万象物语新手大型攻略 服务器、初始号的选择和新手前期需要做的事说明...
  8. WPF实现特殊统计图
  9. React+Webpack+Antd+Babel 兼容低版本浏览器(上)
  10. ant centos环境下 编译没有将配置文件加载_Linux 下的动态库、静态库与环境变量...
  11. 移动硬盘格式化了?可以这样恢复数据
  12. ajax调取mysql数据显示在html_ajax实现从后台拿数据显示在HTML前端的方法
  13. asp dotnet core 从零开始创建一个 WebApi 服务
  14. 小功能⭐️Unity动态更改 Scripting Define Symbols (宏定义)
  15. 冬天吃柿子养颜防衰老
  16. 初学5之坦克要求(做出坦克被子弹击中时的爆炸效果)
  17. 中国成最大工业机器人市场 年增长速度25%
  18. 公路建设过程中路肩石水渠机的处理点
  19. 九月英语——梦开始的地方
  20. R语言数据科学:变量选择(一)逐步回归法

热门文章

  1. SDR技术原理解析 USRP收发原理
  2. 已知三角形三边求面积
  3. 手动卸载 Office 2013 或 Office 365
  4. Android 各种截屏方法
  5. c++numeric
  6. 【漫漫转码路】Day 28 C++ day01
  7. matlab曲面拟合的算法,用Matlab 实现移动曲面拟合法生成DEM
  8. 对“动态多重网络”建模与目标选择方法的介绍
  9. win7 开启无线网
  10. 是怎么样的SQL优化能做到 900W+数据,从17s到300ms?