fun getDiskInfo(context: Context):List<String> {
var paths = ArrayList<String>()
try {
val storageManager = context.getSystemService(Context.STORAGE_SERVICE) as StorageManager
val storageManagerClazz = Class.forName("android.os.storage.StorageManager")
val getVolumesMethod = storageManagerClazz.getMethod("getVolumes")
val volumeInfos = getVolumesMethod.invoke(storageManager) as List<*>
val volumeInfoClazz = Class.forName("android.os.storage.VolumeInfo")
val getTypeMethod = volumeInfoClazz.getMethod("getType")
val getFsUuidMethod = volumeInfoClazz.getMethod("getFsUuid")
val getDisk = volumeInfoClazz.getMethod("getDisk")
val fsTypeField:Field = volumeInfoClazz.getDeclaredField("fsType")
val fsLabelField: Field = volumeInfoClazz.getDeclaredField("fsLabel")
val pathField: Field = volumeInfoClazz.getDeclaredField("path")
val internalPath: Field = volumeInfoClazz.getDeclaredField("internalPath")
val diskInfoClazz = Class.forName("android.os.storage.DiskInfo")
val flagsField:Field = diskInfoClazz.getDeclaredField("flags")
val isSdMethod = diskInfoClazz.getMethod("isSd")
val isUsbMethod = diskInfoClazz.getMethod("isUsb")
if (volumeInfos != null) {
for (volumeInfo in volumeInfos) {
val uuid = getFsUuidMethod.invoke(volumeInfo)
if(uuid != null) {
val path = pathField.get(volumeInfo) as String
paths.add(path)
val disk = getDisk.invoke(volumeInfo)
val flags = flagsField.get(disk) as Int
val isSd = isSdMethod.invoke(disk) as Boolean
val isUsb = isUsbMethod.invoke(disk) as Boolean
Log.e("tag", "getDiskInfo: ===> path:$path flags:$flags isSd:$isSd isUsb:$isUsb")
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
return paths
}