借鉴https://blog.youkuaiyun.com/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
}