关于Android开发时获取IP和MAC地址的问题

获取Android的IP地址和MAC地址

必须声明的是,本文是针对的是较新的安卓API ( Android 7.0以上 ) ,kotlin作为开发语言。



前言

在安卓开发 ( 尤其是针对较新的安卓API ) 时,我们可能会有获取机器的IP和MAC的需求。特地记录于此,以供参考使用。


一、获取权限?

在获取过程中首要且必须的步骤就是获取权限,这里需要两个权限:

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />

那么应该如何获取呢,我们需要修改项目中 AndroidManifest.xml 这个文件,借用安卓开发者文档的例子:

权限获取
将例子中 uses-permission 这一行替换成上述两个权限就可以了。

二、具体获取方法?

1.引入库

导入库的代码如下:

import java.net.InetAddress
import java.net.NetworkInterface
import java.net.SocketException
import java.util.*

2.获取IP地址

代码如下:

fun getIpAddress(): String? {
    
    
    try {
    
    
        val en: Enumeration<NetworkInterface> = NetworkInterface.getNetworkInterfaces()
        while (en.hasMoreElements()) {
    
    
            val nwInterface: NetworkInterface = en.nextElement()
            val enumIpAdder: Enumeration<InetAddress> = nwInterface.inetAddresses
            while (enumIpAdder.hasMoreElements()) {
    
    
                val netAddress: InetAddress = enumIpAdder.nextElement()
                if (!netAddress.isLoopbackAddress  && !netAddress.isLinkLocalAddress) {
    
    
                    return netAddress.hostAddress.toString()
                }
            }
        }
    } catch (e: SocketException) {
    
    
        e.printStackTrace()
    }
    return null
}

3.获取MAC地址

代码如下:

fun getMacAddress(): String? {
    
    
    try {
    
    
        val all: List<NetworkInterface> = Collections.list(NetworkInterface.getNetworkInterfaces())
        for (nif in all) {
    
    
            if (nif.name != "wlan0") {
    
    
                continue
            }
            val macBytes: ByteArray = nif.hardwareAddress ?: return ""
            val res1 = StringBuilder()
            for (b in macBytes) {
    
    
                res1.append(String.format("%02X:", b))
            }
            if (res1.isNotEmpty()) {
    
    
                res1.deleteCharAt(res1.length - 1)
            }
            return res1.toString()
        }
    } catch (e: Exception) {
    
    
        e.printStackTrace()
    }
    return null
}

将以上两个函数放入模块中,正常调用即可获得相应地址。
正文完结。


引用

该篇博客借鉴于以下两篇:

IP地址的获取
MAC地址的获取

于此感谢前人的无私奉献。

猜你喜欢

转载自blog.csdn.net/San__Qi/article/details/110205075