获取mac地址

借鉴https://blog.csdn.net/chaozhung_no_l/article/details/78329371 博主写的,以下是kt写法的代码。

fun getMac(context: Context): String {
    return when {
        Build.VERSION.SDK_INT < Build.VERSION_CODES.M -> {
            getLocalMacAddressFromWifiInfo(context)
        }
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT < Build.VERSION_CODES.N -> {
            getMacAddress()
        }
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> {
            getMoreN()
        }
        else -> {
            ""
        }
    }
}


private fun getMacAddress(): String {

    try {
        val process: Process = Runtime.getRuntime().exec("cat /sys/class/net/wlan0/address")
        val ir = InputStreamReader(process.inputStream)
        val input = LineNumberReader(ir)
        var str: String? = ""

        while (null != str) {
            str = input.readLine()
            if (str != null) {
                return str.trim { it <= ' ' }
            }

        }
    } catch (e: Exception) {
        e.printStackTrace()
        try {
            return loadFileString()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    return ""
}

@SuppressLint("HardwareIds")
private fun getLocalMacAddressFromWifiInfo(context: Context): String {
    val wifiManage: WifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
    val wifiInfo = wifiManage.connectionInfo
    if (wifiInfo.macAddress.isNotBlank()){
        return wifiInfo.macAddress
    }
    return ""
}

private fun loadFileString(): String {
    val fileReader = FileReader("/sys/class/net/eth0/address")
    val builder = StringBuilder()
    val buffer = CharArray(4096)
    var length = fileReader.read(buffer)
    while (length >= 0) {
        builder.append(buffer, 0, length)
        length = fileReader.read(buffer)
    }
    fileReader.close()
    return builder.toString().substring(0, 17)
}

private fun getMoreN(): String {
    return when {
        !TextUtils.isEmpty(getMacAddress1()) -> getMacAddress1()
        !TextUtils.isEmpty(getMacAddress2()) -> getMacAddress2()
        !TextUtils.isEmpty(getMacAddress3()) -> getMacAddress3()
        else -> ""
    }
}


private fun getMacAddress1(): String {
    "getMacAddress1".logi()
    try {
        val ip = localInetAddress
        val b: ByteArray = NetworkInterface.getByInetAddress(ip).hardwareAddress
        val stringBuild = StringBuilder()
        (0 until b.size).forEach {
            if (it != 0) {
                stringBuild.append(":")
            }
            val str = Integer.toHexString((b[it] and 0xFF.toByte()).toInt())
            b[it].logd()
            stringBuild.append(if (str.length == 1) 0.toString() + str else str)
        }
        return stringBuild.toString()
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return ""
}

private// 列举
// 是否还有元素
// 得到下一个元素
// 得到一个ip地址的列举
val localInetAddress: InetAddress?
    get() {
        var ip: InetAddress? = null
        try {
            val enumeration = NetworkInterface
                    .getNetworkInterfaces()
            while (enumeration.hasMoreElements()) {
                val ni = enumeration
                        .nextElement() as NetworkInterface
                val enumeration1 = ni.inetAddresses
                while (enumeration1.hasMoreElements()) {
                    ip = enumeration1.nextElement()
                    if (!ip!!.isLoopbackAddress && ip.hostAddress.indexOf(":") == -1)
                        break
                    else
                        ip = null
                }

                if (ip != null) {
                    break
                }
            }
        } catch (e: SocketException) {
            e.printStackTrace()
        }

        return ip
    }

private fun getMacAddress2(): String {
    "getMacAddress2".logi()
    var interfaces: Enumeration<NetworkInterface>? = null
    try {
        interfaces = NetworkInterface.getNetworkInterfaces()
    } catch (e: Exception) {
        e.printStackTrace()
    }
    if (interfaces == null) {
        return ""
    }
    var networkInterface: NetworkInterface?
    while (interfaces.hasMoreElements()) {
        networkInterface = interfaces.nextElement()
        try {
            val hardWareAddress = bytesToString(networkInterface?.hardwareAddress)
            if (hardWareAddress != null) {
                return hardWareAddress
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    return ""
}

private fun bytesToString(bytes: ByteArray?): String? {
    if (bytes == null || bytes.isEmpty()) {
        return null
    }
    val buf = StringBuilder()
    for (b in bytes) {
        buf.append(String.format("%02X:", b))
    }
    if (buf.isNotEmpty()) {
        buf.deleteCharAt(buf.length - 1)
    }
    return buf.toString()
}

private fun getMacAddress3(): String {
    "getMacAddress3".logi()
    var result: String?
    result = callCmd("busybox ifconfig", "HWaddr")
    if (result == null){
        return ""
    }
    if (result.isNotEmpty() && result.contains("HWaddr")){
        result = result.substring(result.indexOf("HWaddr") + 6, result.length - 1)
    }
    return result
}

private fun callCmd(cmd: String, filter: String): String? {
    var result = ""
    var line: String
    try {
        val proc = Runtime.getRuntime().exec(cmd)
        val inputStreamReader = InputStreamReader(proc.inputStream)
        val br = BufferedReader(inputStreamReader)

        do {
            line = br.readLine()
            if (line != null && !line.contains(filter)){
                result += line
            }
        }while (true)
    } catch (e: Exception) {
        e.printStackTrace()
    }

    return result
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值