android 数据流量 获取mac地址,Android机用移动数据流量获取也能获取mac地址的终极方法。(第二种方法)...

第一种方法:

(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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值