`
totoxian
  • 浏览: 1080143 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

(转)android获取Mac地址和IP地址

 
阅读更多

获取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

分享到:
评论

相关推荐

    Android_获取手机IP和MAC地址

    首先,我们要理解IP地址和MAC地址的概念。IP地址(Internet Protocol Address)是互联网上的设备在网络通信时的标识,它用于区分网络上的不同设备。而MAC地址(Media Access Control Address)则是物理网络接口控制...

    Android获取手机ip地址及mac地址

    在Android开发中,获取设备的IP地址和MAC地址是常见的需求,尤其是在进行网络通信或设备识别时。以下是对如何在Android应用中实现这一功能的详细解析。 ### 一、获取MAC地址 MAC地址(Media Access Control ...

    Android获得设备状态信息、Mac地址、IP地址的方法

    有些软件还要根据Mac地址来判定当前用户以前是否登录过。下面将一一介绍获取这些手机状态信息的方法。 1 通过build获取手机硬件信息 运用反射获取Build信息,然后从build中得到对应字段的值。这种情况适用于获取...

    Android 判断网络是否可用 & 获取IP地址 & 获取以太网口MAC地址

    判断网络是否可用: 注意!是判断网络是否可用,但网络可用不代表一定能上外网的! public static boolean isNetworkAvailable(Context context) { ConnectivityManager manager = (ConnectivityManager) context...

    获取android设备的IP和MAC

    在Android开发中,有时我们需要获取设备的网络状态信息,如IP地址和MAC地址。这些信息在设备连接到网络时尤其重要,例如用于设备间的通信、网络诊断或远程控制。本教程将详细介绍如何在Android应用中获取设备的IP和...

    Android获取连接热点的设备信息ip、mac信息

    Android获取连接热点的设备信息ip、mac信息

    android DHCP获取IP失败分析解决.pdf

    Android DHCP 获取 IP 失败分析和解决 Android 操作系统中,DHCP(Dynamic Host Configuration Protocol)是用于动态分配 IP 地址的协议。然而,在某些情况下,Android 设备可能无法通过 DHCP 获取 IP 地址,导致...

    获取Android手机WiFi局域网下ip地址和MAC地址以及网关地址的小程序.zip

    同时,其特色功能如实时更新的信息推送、个性化推荐以及社交分享功能,让用户能够及时获取所需信息,并方便地将优质内容分享至朋友圈或好友,实现信息的高效传播与互动。 【小程序名称】注重数据安全与隐私保护,...

    Android获取IP地址.txt

    以下是对“Android获取IP地址”这一主题的深入解析。 ### 知识点一:理解NetworkInterface `NetworkInterface`是Java标准库中的一个类,它表示系统中的网络接口,如以太网卡或Wi-Fi适配器。在Android设备上,`...

    android获取ip地址和物理地址

    这是一个封装好的工具类,可以查看本机的ip地址和物理(mac)地址。没有wifi的情况下,也可以查看物理地址。

    android 获取本机的IP地址和mac物理地址的实现方法

    在Android平台上,获取设备的IP地址和MAC物理地址是开发者常用的功能之一,特别是在网络通信或者设备定位等场景中。本文将详细介绍如何在Android应用中实现这两个功能,并提供相关的示例代码。 首先,让我们来理解...

    如何使用Java代码获取Android移动终端Mac地址.zip

    - 如果你的应用可以使用C/C++代码,可以通过Android NDK调用Linux系统函数`ifconfig`或`ip link show`来获取Mac地址,但这需要处理更复杂的跨平台问题。 5. **使用SystemProperties获取** - 在系统服务层面,可以...

    andriod获取局域网内的设备ip跟mac地址

    接下来,获取MAC地址的过程相对复杂一些,因为Android API并不直接提供获取MAC地址的方法。一般情况下,我们可以通过扫描WiFi网络接口来获取MAC地址: ```java public String getMacAddress() { try { List...

    获取以太网和wifiMac地址

    获取IP地址的方法与获取Mac地址类似: 在Windows中: 1. 同样打开命令提示符,输入`ipconfig`。 2. 查找“IPv4 地址”或“IPv6 地址”,对应的值就是IP地址。 在Linux中: 1. 继续在终端中,输入`ifconfig`或`ip...

    获取连接手机热点设备的IP地址

    在Android开发中,有时我们需要获取连接到手机热点设备的IP地址,...通过阅读和理解这段代码,你应该能够熟练掌握如何在Android应用中获取连接到手机热点的设备的IP地址。这将对你进行网络相关的Android开发大有裨益。

    Android手机获取Mac地址的几种方法

    Android 手机获取 Mac 地址的几种方法 Android 手机获取 Mac 地址是 Android 开发中非常重要的一个...Android 手机获取 Mac 地址有多种方法,每种方法都有其特点和适用场景,开发者可以根据实际情况选择合适的方法。

    Android手机获取Mac地址的方法

    在 Android 中获取 Mac 地址有多种方法,本文将详细介绍两种常见的方法:通过 WiFiManager 获取和根据本地 IP 获取。 通过 WiFiManager 获取 Mac 地址 通过 WiFiManager 获取 Mac 地址是最常用的方法之一。 ...

    Android及avd模拟器ip设置详细操作.doc

    Android 模拟器 IP 设置是 Android 开发中一个非常重要的步骤,因为模拟器的 IP 地址和电脑的 IP 地址不同,会导致模拟器无法连接互联网,或者无法与电脑进行通信。本文将详细介绍 Android 模拟器 IP 设置的完整步骤...

    Android 极速获取局域网在线设备信息

    3. **数据解析**:每一行数据按照固定格式解析,提取出IP地址和MAC地址,存储在数据结构(如List或Map)中。 4. **异常处理**:考虑到可能存在的错误情况,如文件不存在、读取失败等,需加入适当的异常处理代码。 5....

Global site tag (gtag.js) - Google Analytics