安卓获取子网掩码(Mask)

百度大法搜的获取网络配置(包括子网掩码)的方法基本都是拿wifimanager的dhcpinfo获取网络信息。

这个方法获取到的其他信息都没问题,唯独子网掩码获取到的要么就是错的,要么就是0.0.0.0

有问题的获取方式如下:

    public static String getNetMask(Context context){
        DhcpInfo dhcpInfo = ((WifiManager) context
                .getSystemService(Context.WIFI_SERVICE)).getDhcpInfo();
        return formatIpAddress(dhcpInfo.netmask);
    }
    private static String formatIpAddress(int ipAdress) {

        return (ipAdress & 0xFF ) + "." +
                ((ipAdress >> 8 ) & 0xFF) + "." +
                ((ipAdress >> 16 ) & 0xFF) + "." +
                ( ipAdress >> 24 & 0xFF) ;
    }

我使用此方式获取的子网掩码大多数是0.0.0.0,偶尔是255.0.0.0,但真实的子网掩码是255.255.252.0

参考终于取到了Android的子网掩码 - 简书 (jianshu.com)的方法

使用ifconfig并解析的方式获取子网掩码,但是参考链接里没有做出网卡区分,在此对这个方法做一定的修改

针对的默认ifconfig的打印如下:

wlan0     Link encap:Ethernet  HWaddr 44:01:bb:4e:0d:8a  Driver rtl8723du
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:19568 errors:0 dropped:36 overruns:0 frame:0 
          TX packets:6412 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1000 
          RX bytes:2554230 TX bytes:3465241 

p2p0      Link encap:Ethernet  HWaddr 46:01:bb:4e:0d:8a  Driver rtl8723du
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1000 
          RX bytes:0 TX bytes:0 

eth0      Link encap:Ethernet  HWaddr bc:26:1d:04:4a:f9
          inet addr:192.168.50.6  Bcast:192.168.50.255  Mask:255.255.255.0 
          inet6 addr: fe80::6de2:eac1:c614:5ccb/64 Scope: Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:224 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:6665 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1000 
          RX bytes:29352 TX bytes:2200704 
          Interrupt:41 Base address:0x4000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0 
          inet6 addr: ::1/128 Scope: Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:255 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:255 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1 
          RX bytes:18156 TX bytes:18156

分别作了获取默认的wlan0的子网掩码和获取eth0的子网掩码,代码如下:

private static final String defaultIP = "0.0.0.0";
        private static final String command = "ifconfig";
        public static String getWlan0Mask() {
            String TAG = "lanky";
            String Mask = defaultIP;
            try {
                Process process = Runtime.getRuntime().exec(new String[]{command});
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                do {
                    String line = bufferedReader.readLine();
                    if (line == null) {
                        Log.d(TAG, "test: line is null");
                        break;
                    }
                    if (line.startsWith("wlan0     ")) {
                        Mask = defaultIP;
                    }
                    Mask = getLineMask(line).equals("") ?Mask:getLineMask(line);
                    if (line.startsWith("p2p0      ")) {
                        break;
                    }


                } while (true);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return Mask;
        }
        public static String getEth0Mask() {
            String TAG = "lanky";
            String Mask = defaultIP;
            try {
                Process process = Runtime.getRuntime().exec(new String[]{command});
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                do {
                    String line = bufferedReader.readLine();
                    if (line == null) {
                        Log.d(TAG, "test: line is null");
                        break;
                    }
                    if (line.startsWith("eth0      ")) {
                        Mask = defaultIP;
                    }
                    Mask = getLineMask(line).equals("") ?Mask:getLineMask(line);
                    if (line.startsWith("lo        ")) {
                        break;
                    }
                } while (true);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return Mask;
        }

        private static String getLineMask(String line){
            String TAG = "mask";
            String IP = "";
            if (line.trim().matches("inet addr:(\\d{1,3}\\.){3}\\d{1,3}( ){2}" +
                    "(Bcast:(\\d{1,3}\\.){3}\\d{1,3}( ){2}){0,1}" +
                    "Mask:(\\d{1,3}\\.){3}\\d{1,3}")) {
                String[] props = line.trim().split("( ){2}");
                for (String prop : props) {
                    if (prop.length() == 0) {
                        continue;
                    }

                    String[] kv = prop.split(":");
                    if (kv[0].startsWith("inet addr")) {
                        Log.d(TAG, "----ipAddr: " + kv[1]);
                    } else if (kv[0].startsWith("Bcast")) {
                        Log.d(TAG, "----Bcast: " + kv[1]);
                    } else if (kv[0].startsWith("Mask")) {
                        Log.d(TAG, "----mask: " + kv[1]);
                        IP = kv[1];
                    }
                }
            }
            return IP;
        }

如果有多个网卡,要想获取别的,可以参考我这个代码,根据你自己的ifconfig的打印来修改就好了

注:需要uid.system和系统签名及权限,适合系统级应用的开发参考,比如setting、Launcher等

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值