获取Mac地址实际项目中测试了如下几种方法:
(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法)
//根据Wifi信息获取本地Mac
public static String getLocalMacAddressFromWifiInfo(Context context){
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
return info.getMacAddress();
}
(2)调用Linux的busybox,通过linux命令来获取
//根据busybox获取本地Mac
public static String getLocalMacAddressFromBusybox(){
String result = "";
String Mac = "";
result = callCmd("busybox ifconfig","HWaddr");
//如果返回的result == null,则说明网络不可取
if(result==null){
return "网络出错,请检查网络";
}
//对该行数据进行解析
//例如:eth0 Link encap:Ethernet HWaddr 00:16:E8:3E:DF:67
if(result.length()>0 && result.contains("HWaddr")==true){
Mac = result.substring(result.indexOf("HWaddr")+6, result.length()-1);
Log.i("test","Mac:"+Mac+" Mac.length: "+Mac.length());
/*if(Mac.length()>1){
Mac = Mac.replaceAll(" ", "");
result = "";
String[] tmp = Mac.split(":");
for(int i = 0;i<tmp.length;++i){
result +=tmp[i];
}
}*/
result = Mac;
Log.i("test",result+" result.length: "+result.length());
}
return result;
}
private static String callCmd(String cmd,String filter) {
String result = "";
String line = "";
try {
Process proc = Runtime.getRuntime().exec(cmd);
InputStreamReader is = new InputStreamReader(proc.getInputStream());
BufferedReader br = new BufferedReader (is);
//执行命令cmd,只取结果中含有filter的这一行
while ((line = br.readLine ()) != null && line.contains(filter)== false) {
//result += line;
Log.i("test","line: "+line);
}
result = line;
Log.i("test","result: "+result);
}
catch(Exception e) {
e.printStackTrace();
}
return result;
}
(3)调用android 的API: NetworkInterface. getHardwareAddress ()
该API的level为9,只有android 2.3以上才有该接口
//根据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);
}
其中getLocalIpAddress是获取本地IP地址
//获取本地IP
public static String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface
.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf
.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex) {
Log.e("WifiPreference IpAddress", ex.toString());
}
return null;
}
获取本地IP地址
在网络上搜索一下,一般就有如下的代码:
//获取本地IP
public static String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface
.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf
.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex) {
Log.e("WifiPreference IpAddress", ex.toString());
}
return null;
}
但是经过测试该方法在android2.3, 2.2...较老版本有效,但是在android较新版本(例如4.0等)获取的数据不正确。
获取到了类似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;
}
网络上还有一种方法来获取本地IP地址(不过是在wifi状态下)
通过WifiManager, DhcpInfo获取IP地址以及网关等信息(在android4.0等版本也适用)
package com.jason.demo.androidip;
import android.content.Context;
import android.net.DhcpInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.text.format.Formatter;
public class IPAddress {
public String getIPAddress(Context ctx){
WifiManager wifi_service = (WifiManager) ctx.getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcpInfo = wifi_service.getDhcpInfo();
WifiInfo wifiinfo = wifi_service.getConnectionInfo();
System.out.println("Wifi info----->"+wifiinfo.getIpAddress());
System.out.println("DHCP info gateway----->"+Formatter.formatIpAddress(dhcpInfo.gateway));
System.out.println("DHCP info netmask----->"+Formatter.formatIpAddress(dhcpInfo.netmask));
//DhcpInfo中的ipAddress是一个int型的变量,通过Formatter将其转化为字符串IP地址
return Formatter.formatIpAddress(dhcpInfo.ipAddress);
}
}
加入permission
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
不过我自己在做项目过程中,用另外一种方法也解决了android4.0获取IP错误的问题:
//获取本地IP
public static String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface
.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> 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;
}
参考博文:
http://www.cnblogs.com/Amandaliu/archive/2011/11/06/2238177.html
Android获取Mac地址
http://blog.csdn.net/ccf0703/article/details/7451274
解决安卓4.0获取本地IP地址问题。
http://blog.csdn.net/garybook/article/details/7874456
通过WifiManager,DhcpInfo获取android IP地址及网关等信息(两种方式)
http://blog.csdn.net/lizzydarcymsp/article/details/5623302
利用InetAddress类确定特殊IP地址 (isLinkLocalAddress,isLoopbackAddress等)
转自:http://www.cnblogs.com/lijunamneg/archive/2013/03/04/2943146.html
分享到:
相关推荐
首先,我们要理解IP地址和MAC地址的概念。IP地址(Internet Protocol Address)是互联网上的设备在网络通信时的标识,它用于区分网络上的不同设备。而MAC地址(Media Access Control Address)则是物理网络接口控制...
在Android开发中,获取设备的IP地址和MAC地址是常见的需求,尤其是在进行网络通信或设备识别时。以下是对如何在Android应用中实现这一功能的详细解析。 ### 一、获取MAC地址 MAC地址(Media Access Control ...
有些软件还要根据Mac地址来判定当前用户以前是否登录过。下面将一一介绍获取这些手机状态信息的方法。 1 通过build获取手机硬件信息 运用反射获取Build信息,然后从build中得到对应字段的值。这种情况适用于获取...
判断网络是否可用: 注意!是判断网络是否可用,但网络可用不代表一定能上外网的! public static boolean isNetworkAvailable(Context context) { ConnectivityManager manager = (ConnectivityManager) context...
在Android开发中,有时我们需要获取设备的网络状态信息,如IP地址和MAC地址。这些信息在设备连接到网络时尤其重要,例如用于设备间的通信、网络诊断或远程控制。本教程将详细介绍如何在Android应用中获取设备的IP和...
Android获取连接热点的设备信息ip、mac信息
Android DHCP 获取 IP 失败分析和解决 Android 操作系统中,DHCP(Dynamic Host Configuration Protocol)是用于动态分配 IP 地址的协议。然而,在某些情况下,Android 设备可能无法通过 DHCP 获取 IP 地址,导致...
同时,其特色功能如实时更新的信息推送、个性化推荐以及社交分享功能,让用户能够及时获取所需信息,并方便地将优质内容分享至朋友圈或好友,实现信息的高效传播与互动。 【小程序名称】注重数据安全与隐私保护,...
以下是对“Android获取IP地址”这一主题的深入解析。 ### 知识点一:理解NetworkInterface `NetworkInterface`是Java标准库中的一个类,它表示系统中的网络接口,如以太网卡或Wi-Fi适配器。在Android设备上,`...
这是一个封装好的工具类,可以查看本机的ip地址和物理(mac)地址。没有wifi的情况下,也可以查看物理地址。
在Android平台上,获取设备的IP地址和MAC物理地址是开发者常用的功能之一,特别是在网络通信或者设备定位等场景中。本文将详细介绍如何在Android应用中实现这两个功能,并提供相关的示例代码。 首先,让我们来理解...
- 如果你的应用可以使用C/C++代码,可以通过Android NDK调用Linux系统函数`ifconfig`或`ip link show`来获取Mac地址,但这需要处理更复杂的跨平台问题。 5. **使用SystemProperties获取** - 在系统服务层面,可以...
接下来,获取MAC地址的过程相对复杂一些,因为Android API并不直接提供获取MAC地址的方法。一般情况下,我们可以通过扫描WiFi网络接口来获取MAC地址: ```java public String getMacAddress() { try { List...
获取IP地址的方法与获取Mac地址类似: 在Windows中: 1. 同样打开命令提示符,输入`ipconfig`。 2. 查找“IPv4 地址”或“IPv6 地址”,对应的值就是IP地址。 在Linux中: 1. 继续在终端中,输入`ifconfig`或`ip...
在Android开发中,有时我们需要获取连接到手机热点设备的IP地址,...通过阅读和理解这段代码,你应该能够熟练掌握如何在Android应用中获取连接到手机热点的设备的IP地址。这将对你进行网络相关的Android开发大有裨益。
Android 手机获取 Mac 地址的几种方法 Android 手机获取 Mac 地址是 Android 开发中非常重要的一个...Android 手机获取 Mac 地址有多种方法,每种方法都有其特点和适用场景,开发者可以根据实际情况选择合适的方法。
在 Android 中获取 Mac 地址有多种方法,本文将详细介绍两种常见的方法:通过 WiFiManager 获取和根据本地 IP 获取。 通过 WiFiManager 获取 Mac 地址 通过 WiFiManager 获取 Mac 地址是最常用的方法之一。 ...
Android 模拟器 IP 设置是 Android 开发中一个非常重要的步骤,因为模拟器的 IP 地址和电脑的 IP 地址不同,会导致模拟器无法连接互联网,或者无法与电脑进行通信。本文将详细介绍 Android 模拟器 IP 设置的完整步骤...
4. **调用服务方法**:一旦连接建立,客户端可以通过`IServiceConnection` 的`onServiceConnected()` 回调获取到`IBinder` 对象的代理,然后就可以通过这个代理调用服务端的方法,比如设置IP和MAC地址。 5. **实现...