第一种方法:
(1)设备开通Wifi连接,获取到网卡的MAC地址和IP地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法)
//根据Wifi信息获取本地Mac
public static voidgetLocalMacAddressFromWifiInfo(Context context)
{
WifiManagerwifi =(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiInfoinfo = wifi.getConnectionInfo();
StringmacAdress = info.getMacAddress(); //获取mac地址
intipAddress=info.getIpAddress();//获取ip地址
Stringip=intToIp(ipAddress);
}
publicStringintToIp(inti)
{
return((i>>24)&0xFF)+"."+((i>>16)&0xFF)+"."
+((i>>8)&0xFF)+"."+(i&0xFF);
}
这里需要加入permission
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
第二种方法:
调用android 的API:NetworkInterface. getHardwareAddress ()
首先是getLocalIpAddress,获取本地IP地址.
//获取本地IP
public static StringgetLocalIpAddress()
{
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;
}
但如果没有红色部分代码。该方法在android2.3, 2.2...较老版本有效,在android较新版本
(例如4.0等)获取的数据不正确(我们这里增加了红色部分后,可以支持4.0以上版本)
然后,再根据IP地址获取到MAC地址:
public static StringgetLocalMacAddressFromIp(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 staticString byte2hex(byte[]b)
{
StringBuffer hs =newStringBuffer(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;
}