Android 裝置區分sdcard路徑和OTG路徑
阿新 • • 發佈:2019-01-22
試了好多種辦法,拿不到行動硬碟的地址,最後通過反射得到。。。。
public void getDiskInfo() { StorageManager mstorageManager = (StorageManager) this.getApplicationContext().getSystemService(Context.STORAGE_SERVICE); try { //DiskInfo Class<?> diskIndoClass = Class.forName("android.os.storage.DiskInfo"); Method isUsb = diskIndoClass.getMethod("isUsb"); Method isSd = diskIndoClass.getMethod("isSd"); //VolumeInfo Class<?> volumeClass = Class.forName("android.os.storage.VolumeInfo"); Method volumeDisk = volumeClass.getMethod("getDisk"); Method fsUuid = volumeClass.getMethod("getFsUuid"); Method path = volumeClass.getMethod("getPath"); Method getVolumes = StorageManager.class.getDeclaredMethod("getVolumes"); List volumeInfoList = (List) getVolumes.invoke(mstorageManager); for(int i= 0 ;i<volumeInfoList.size();i++){ //反射得到diskInfo,並判斷是不是usb if(volumeDisk.invoke(volumeInfoList.get(i)) != null && (boolean)isUsb.invoke(volumeDisk.invoke(volumeInfoList.get(i)))){ String path_usb = "mnt/media_rw/"+fsUuid.invoke(volumeInfoList.get(i)); Log.e("willie","usb path::"+path_usb); // Log.e("willie","sdcard path_path::"+path.invoke(volumeInfoList.get(i))); tv_msg.setText("usb:"+path_usb); Log.e("willie","fsUuid::"+fsUuid.invoke(volumeInfoList.get(i))); } else if(volumeDisk.invoke(volumeInfoList.get(i)) != null && (boolean)isSd.invoke(volumeDisk.invoke(volumeInfoList.get(i)))){ String path_sdcard =""+path.invoke(volumeInfoList.get(i)); Log.e("willie","sdcard path::"+path_sdcard); tv_msg1.setText("sdcard:"+path_sdcard); Log.e("willie","fsUuid::"+fsUuid.invoke(volumeInfoList.get(i))); } else{ Log.e("willie","other::"+path.invoke(volumeInfoList.get(i))); } } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } }