獲取網絡信息,ip,子網掩碼,網關,dns

無線網絡信息可以通過api直接獲取,無需特別處理,下面主要是機頂盒等android設備使用有線網絡時網絡信息的獲取。

1.網絡類型

    /**
     * 獲取網絡類型
     * @return
     *      -1:未知網絡
     *       0:無網絡
     *       1:wifi網絡
     *       2:移動網絡
     *       3:以太網
     */
    public static int getNetWorkInfo() {
        ConnectivityManager connectivityManager = (ConnectivityManager) MyApplication.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = connectivityManager.getActiveNetworkInfo();
        if (info != null && info.isAvailable()) {
            if (info.getType() == ConnectivityManager.TYPE_WIFI) {
                return 1;
            }
            if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
                return 2;
            }
            if (info.getType() == ConnectivityManager.TYPE_ETHERNET) {
                return 3;
            }
        } else {
            return 0;
        }
        return -1;
    }

2.獲取詳細網絡信息

	static final String etName = "eth0";

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    private static NetWorkInfo getETnetwork(NetWorkInfo netWorkInfo) {
        EthernetManager mEthernetManager = (EthernetManager) MyApplication.getContext().getSystemService("ethernet");
        IpConfiguration configuration = mEthernetManager.getConfiguration();
        if (configuration == null) {
            return netWorkInfo;
        }
        IpConfiguration.IpAssignment ipAssignment = configuration.getIpAssignment();
        if (ipAssignment == null) {
            return netWorkInfo;
        }
        String ip = "";
        String mask = "";
        String gateway = "";
        String dns1 = "";
        String dns2 = "";
        if (IpConfiguration.IpAssignment.DHCP == ipAssignment) {//DHCP自動分配方式
            Log.i(TAG, "DHCP");
            ip = getSystemOsString("dhcp." + etName + ".ipaddress");//ip
            mask = getSystemOsString("dhcp." + etName + ".mask");
            gateway = getSystemOsString("dhcp." + etName + ".gateway");
            dns1 = getSystemOsString("dhcp." + etName + ".dns1");
            dns2 = getSystemOsString("dhcp." + etName + ".dns2");

        } else if (IpConfiguration.IpAssignment.STATIC == ipAssignment) {//手動設置方式
            Log.i(TAG, "STATIC");
            ip = configuration.getStaticIpConfiguration().ipAddress.getAddress().getHostAddress();
            mask = getMask(configuration.getStaticIpConfiguration().ipAddress.getPrefixLength());
            gateway = configuration.getStaticIpConfiguration().gateway.getHostAddress();
            dns1 = configuration.getStaticIpConfiguration().dnsServers.get(0).getHostAddress();
            dns2 = configuration.getStaticIpConfiguration().dnsServers.get(1).getHostAddress();
        }
        netWorkInfo.mask = mask;//子網掩碼
        netWorkInfo.gateway = gateway;//網關
        netWorkInfo.dns1 = dns1;//dns1
        netWorkInfo.dns2 = dns2;//dns2
        return netWorkInfo;
    }

    /**
     * 計算子網掩碼
     */
    private static String getMask(int prefix) {
        StringBuilder stb = new StringBuilder();
        StringBuilder result = new StringBuilder();
        for (int i = 1; i <= 32; i++) {
            stb.append(i <= prefix ? "1" : "0");
            if (i % 8 == 0) {
                result.append(Integer.parseInt(stb.toString(), 2)).append(".");
                stb.setLength(0);
            }
        }
        return result.deleteCharAt(result.length() - 1).toString();
    }

    private static String getSystemOsString(String property) {
        Class clazz = null;
        try {
            clazz = Class.forName("android.os.SystemProperties");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return unknown;
        }
        Method met;
        try {
            met = clazz.getMethod("get", String.class, String.class);
            met.setAccessible(true);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
            return unknown;
        }
        Object obj = null;
        try {
            obj = met.invoke(null, new Object[]{property, "unknown"});
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            return unknown;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return unknown;
        } catch (InvocationTargetException e) {
            e.printStackTrace();
            return unknown;
        }
        return (String) obj;
    }

關於子網掩碼的計算:
prefixLength最大32位,可以分成4組8個1的二進制,正好是255,255,255,255,少N位就要在末尾去掉N個1加上N個0,然後再把4組二進制數據換成十進制就得出最終結果;
例如:
30 = 255,255,255,252
26 = 255,255,255,192
最後,EthernetManager這個類是被隱藏的,可以自己把這一部分的android源碼加到自己的項目裏去調用,也可以用我上傳的jar包直接用。
android.net.jar

發佈了48 篇原創文章 · 獲贊 53 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章