文章标题

第一种方法:

(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;
}
但如果没有红色部分代码。该方法在android2.3, 2.2…较老版本有效,在android较新版本
(例如4.0等)获取的数据不正确(我们这里增加了红色部分后,可以支持4.0以上版本)
然后,再根据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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值