zoukankan      html  css  js  c++  java
  • 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

    然后我自己弱弱说一句, 我用前面两种方法的时候有空指针,最后采取的本地IP获取mac地址。

  • 相关阅读:
    logstash日志分析的配置和使用
    实现跨浏览器html5表单验证
    CSS常见居中讨论
    centos7 初始化脚本
    elasticsearch+logstash+redis+kibana 实时分析nginx日志
    centos7 系统优化
    cAdvisor+InfluxDB+Grafana 监控Docker
    Docker三剑客之Docker Swarm
    Docker三剑客之常用命令
    Docker三剑客之Docker Compose
  • 原文地址:https://www.cnblogs.com/Sharley/p/6236085.html
Copyright © 2011-2022 走看看