android WifiMange獲取IP爲負

通過WifiMange獲得ip步驟如下:

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);  
WifiInfo wifiInfo = wifiManager.getConnectionInfo();       
int ipAddress = wifiInfo.getIpAddress();   
String ip = String.format("%d.%d.%d.%d", (ipAddress & 0xff), (ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff)); 

目前還不清楚什麼原因,某些設備獲取wifiInfo.getIpAddress()返回值是個負數值;

所以查看android源碼【AbstractIpAddressPreferenceController.java】

  @Override
    protected void updateConnectivity() {
        String ipAddress = getDefaultIpAddresses(mCM);
        if (ipAddress != null) {
            mIpAddress.setSummary(ipAddress);
        } else {
            mIpAddress.setSummary(R.string.status_unavailable);
        }
    }

    /**
     * Returns the default link's IP addresses, if any, taking into account IPv4 and IPv6     style
     * addresses.
     * @param cm ConnectivityManager
     * @return the formatted and newline-separated IP addresses, or null if none.
     */
    private static String getDefaultIpAddresses(ConnectivityManager cm) {
        LinkProperties prop = cm.getActiveLinkProperties();
        return formatIpAddresses(prop);
    }

    private static String formatIpAddresses(LinkProperties prop) {
        if (prop == null) return null;
        Iterator<InetAddress> iter = prop.getAllAddresses().iterator();
        // If there are no entries, return null
        if (!iter.hasNext()) return null;
        // Concatenate all available addresses, newline separated
        StringBuilder addresses = new StringBuilder();
        while (iter.hasNext()) {
            addresses.append(iter.next().getHostAddress());
            if (iter.hasNext()) addresses.append("\n");
        }
        return addresses.toString();
    }

可以看到,系統源碼是用ConnectivityManager 方法獲取,從中提取後方法如下:

ConnectivityManager conMann =(ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mobileNetworkInfo = 
conMann.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            NetworkInfo wifiNetworkInfo = conMann.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mobileNetworkInfo.isConnected()) {
    System.out.println("ip ==== " + getLocalIpAddress());
}

經過測試,可以獲得正確IP地址;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章