Android区分SD卡和U盘

        写过这个功能的童鞋应该很理解我,当初找了大量的资料也只能做到在两者都插入时分辨出哪个是哪个,只插入其中一方,则一脸无奈,当初我甚至在界面上写"检测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);
好了,就这些了.


猜你喜欢

转载自blog.csdn.net/qq_37069563/article/details/80271113