通过反射获取挂载的存储设备的路径并判断设备的类型(SD,USB)

/**
 *  此方法   应该 !!  适用于Android6.0以及以上的系统
 *  因为Android6.0以下的系统并没有DiskInfo.java这个类(我只在8.1上试验过,查看过5.1,6.0,7.1等源码是否有DiskInfo这个
 *  类)如果此方法不行的话请评论告知,谢谢
 *  Android6.0以下的方式之后补充研究吧
 *  以下部分代码只做研究用途并没有实际调用,可以删除,另外还可以通过这种反射的方式获取到存储设备的大小等等的信息
 */
fun getDiskInfo(context: Context):List {
    var paths = ArrayList()
    try {
        val storageManager = context.getSystemService(Context.STORAGE_SERVICE) as StorageManager
        val storageManagerClazz = Class.forName("android.os.storage.StorageManager")//反射取到StorageManager
        val getVolumesMethod = storageManagerClazz.getMethod("getVolumes")
        val volumeInfos = getVolumesMethod.invoke(storageManager) as List<*> //获取到了VolumeInfo的列表

        val volumeInfoClazz = Class.forName("android.os.storage.VolumeInfo")//反射取到VolumeInfo
        val getTypeMethod = volumeInfoClazz.getMethod("getType")//获取设备类型的方法
        val getFsUuidMethod = volumeInfoClazz.getMethod("getFsUuid")//获取设备uuid的方法
        val getDisk = volumeInfoClazz.getMethod("getDisk") //获取Disk对象的方法
        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")//反射取到DiskInfo
        val flagsField:Field = diskInfoClazz.getDeclaredField("flags") //获取到diskInfo中的flags
        val isSdMethod = diskInfoClazz.getMethod("isSd")    //判断此disk是否是sd卡类型
        val isUsbMethod = diskInfoClazz.getMethod("isUsb") //判断此disk是否是USB卡类型


        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("zhang", "getDiskInfo: ===>    path:$path     flags:$flags     isSd:$isSd        isUsb:$isUsb")
                }
            }
        }

    } catch (e: Exception) {
        e.printStackTrace()
    }
    return paths
}

你可能感兴趣的:(通过反射获取挂载的存储设备的路径并判断设备的类型(SD,USB))