第一种方法:
(1)设备开通Wifi连接,获取到网卡的MAC地址和IP地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法)
//根据Wifi信息获取本地Mac
public static void getLocalMacAddressFromWifiInfo(Context context)
{
WifiManager wifi = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
String macAdress = info.getMacAddress(); //获取mac地址
int ipAddress = info.getIpAddress(); //获取ip地址
String ip = intToIp(ipAddress);
}
public String intToIp(int i)
{
return ((i >> 24) & 0xFF) + "." + ((i >> 16) & 0xFF) + "."
+((i >> 8 ) & 0xFF) + "." + ( i & 0xFF) ;
}
这里需要加入permission
第二种方法:
调用android 的API: NetworkInterface. getHardwareAddress ()
首先是getLocalIpAddress,获取本地IP地址.
//获取本地IP
public static String getLocalIpAddress()
{
try {
for (Enumeration en = NetworkInterface
.getNetworkInterfaces(); en.hasMoreElements();)
{
NetworkInterface intf = en.nextElement();
for(Enumeration enumIpAddr = intf
.getInetAddresses(); enumIpAddr.hasMoreElements();)
{
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()
&&!inetAddress.isLinkLocalAddress())
{
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex)
{
Log.e("WifiPreference IpAddress", ex.toString());
}
return null;
}
然后,再根据IP地址获取到MAC地址:
public static String getLocalMacAddressFromIp(Context context)
{
String mac_s= "";
try {
byte[] mac;
NetworkInterface ne =
NetworkInterface.getByInetAddress(InetAddress.getByName(getLocalIpAddress()));
mac = ne.getHardwareAddress();
mac_s = byte2hex(mac);
} catch (Exception e) {
e.printStackTrace();
}
return mac_s;
}
public static String byte2hex(byte[] b)
{
StringBuffer hs = new StringBuffer(b.length);
String stmp = "";
int len = b.length;
for (int n = 0; n < len; n++)
{
stmp = Integer.toHexString(b[n] & 0xFF);
if(stmp.length() == 1){
hs = hs.append("0").append(stmp);
}else {
hs = hs.append(stmp);
}
}
return String.valueOf(hs);
}
针对获取IP地址的方法,还有一种改进方法,这是是网上运用比较多的,测试表明,该方法获取到了类似fe80::b607:f9ff:fee5:487e..这样的IP地址。注意看这里的IP地址是IPV6的地址形式。所以,一种解决方法是,在上面代码中的最内层的for循环的if语句中对inetAddress进行格式判断,只有其是IPV4格式地址时,才返回值。修改后代码如下:
public String getLocalIpAddress() {
try {
String ipv4;
List nilist = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface ni: nilist)
{
List ialist = Collections.list(ni.getInetAddresses());
for (InetAddress address: ialist)
{
if (!address.isLoopbackAddress() &&
InetAddressUtils.isIPv4Address(ipv4=address.getHostAddress()))
{
return ipv4;
}
}
}
} catch (SocketException ex) {
Log.e(LOG_TAG, ex.toString());
}
return null;
}