区分外置U盘及TF卡
最近有个项目有内置SD卡同时又保留了USB及sd卡口,由于要计算外置存储设备的空间,尝试了几个方法均不理想最终使用如下方法 可以成功的区分外置设备是U盘还是SD卡。
主要通过如下方法区分U盘及TF卡
1 @SuppressLint("PrivateApi") 2 private String getStoragePath(Context context, boolean isUsb){ 3 4 5 String path=""; 6 StorageManager mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); 7 Class<?> volumeInfoClazz; 8 Class<?> diskInfoClaszz; 9 try { 10 11 12 volumeInfoClazz = Class.forName("android.os.storage.VolumeInfo"); 13 diskInfoClaszz = Class.forName("android.os.storage.DiskInfo"); 14 Method StorageManager_getVolumes=Class.forName("android.os.storage.StorageManager").getMethod("getVolumes"); 15 Method VolumeInfo_GetDisk = volumeInfoClazz.getMethod("getDisk"); 16 Method VolumeInfo_GetPath = volumeInfoClazz.getMethod("getPath"); 17 Method DiskInfo_IsUsb = diskInfoClaszz.getMethod("isUsb"); 18 Method DiskInfo_IsSd = diskInfoClaszz.getMethod("isSd"); 19 List<Object> List_VolumeInfo = (List<Object>) StorageManager_getVolumes.invoke(mStorageManager); 20 assert List_VolumeInfo != null; 21 for(int i=0; i<List_VolumeInfo.size(); i++){ 22 23 24 Object volumeInfo = List_VolumeInfo.get(i); 25 Object diskInfo = VolumeInfo_GetDisk.invoke(volumeInfo); 26 if(diskInfo==null)continue; 27 boolean sd= (boolean) DiskInfo_IsSd.invoke(diskInfo); 28 boolean usb= (boolean) DiskInfo_IsUsb.invoke(diskInfo); 29 File file= (File) VolumeInfo_GetPath.invoke(volumeInfo); 30 if(isUsb == usb){ 31 32 //usb 33 assert file != null; 34 path=file.getAbsolutePath(); 35 }else if(!isUsb == sd){ 36 37 //sd 38 assert file != null; 39 path=file.getAbsolutePath(); 40 } 41 } 42 } catch (Exception e) { 43 44 45 YYLog.print(TAG, "[——————— ——————— Exception:"+e.getMessage()+"]"); 46 e.printStackTrace(); 47 } 48 return path; 49 }