Android獲取IP地址詳解

在 Android 開發中,獲取設備 IP 地址是一項非常常見的任務。Android 操作系統提供了多種方式來獲取設備的 IP 地址,本文將介紹其中一些方法。

一、Android 獲取 IP 地址許可權

在 Android 中獲取 IP 地址時,需要獲取以下許可權:


<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

二、Android 獲取 IP 地址

在 Android 中獲取 IP 地址的方法主要有兩種:

1. 使用 NetworkInterface 獲取 IP 地址

可以通過 NetworkInterface 來獲取設備的所有網路介面,然後遍歷每個網路介面的所有地址,查找 IPv4 類型的地址即可獲取到設備的 IP 地址。


public static String getIPAddress() {
    try {
        List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface intf : interfaces) {
            List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
            for (InetAddress addr : addrs) {
                if (!addr.isLoopbackAddress() && addr instanceof Inet4Address) {
                    return addr.getHostAddress();
                }
            }
        }
    } catch (Exception e) {
        Log.e("getIPAddress", e.toString());
    }
    return "";
} 

  • 該方法返回設備的 IPv4 地址
  • 如果設備沒有網路連接,該方法將返回空字元串
  • 該方法需要在 AndroidManifest.xml 中聲明上述兩個許可權

2. 使用 WifiManager 獲取 IP 地址

可以通過 WifiManager 來獲取設備當前連接的 Wifi 路由器的 IP 地址。


public static String getWifiIPAddress(Context context) {
    WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
    int ipAddress = wifiInfo.getIpAddress();
    return Formatter.formatIpAddress(ipAddress);
} 

  • 該方法返回當前連接的 Wifi 路由器的IPv4地址
  • 如果設備沒有連接 Wifi,該方法將返回 “0.0.0.0”
  • 該方法需要在 AndroidManifest.xml 中聲明上述兩個許可權

三、Android 查看 IP 地址

可以通過 Android 系統提供的設置界面來查看當前設備的 IP 地址:

  1. 打開 Android 系統設置
  2. 進入「關於手機」或「設備信息」
  3. 查看「狀態」或「Wi-Fi狀態」,可以看到 “IP 地址” 的信息

四、獲取 IP 地址的 DNS

DNS 是通過域名查找 IP 地址的一種服務,可以通過以下方法來查看 DNS:


public static List<String> getDNS(Context context) {
    List<String> dnsList = new ArrayList<String>();
    WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    DhcpInfo dhcpInfo = wifiMgr.getDhcpInfo();
    int dns1 = dhcpInfo.dns1;
    int dns2 = dhcpInfo.dns2;
    dnsList.add(Formatter.formatIpAddress(dns1));
    dnsList.add(Formatter.formatIpAddress(dns2));
    return dnsList;
} 

五、Android 設置 IP 地址

在 Android 中,可以通過以下代碼來設置設備的靜態 IP 地址:


private void setStaticIpAddress(String ip, String gateway, String netmask, String dns1, String dns2) {
    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    WifiConfiguration wifiConfig = null;
    WifiInfo connectionInfo = wifiManager.getConnectionInfo();
    List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
    if (configuredNetworks != null) {
        String ssid = connectionInfo.getSSID();
        for (WifiConfiguration conf : configuredNetworks) {
            if (ssid.equals(conf.SSID)) {
                wifiConfig = conf;
                break;
            }
        }
        if (wifiConfig != null) {
            try {
                setIpAssignment("STATIC", wifiConfig);
                setIpAddress(InetAddress.getByName(ip), Integer.parseInt(netmask), wifiConfig);
                setGateway(InetAddress.getByName(gateway), wifiConfig);
                setDNS(InetAddress.getByName(dns1), InetAddress.getByName(dns2), wifiConfig);
                wifiManager.updateNetwork(wifiConfig);
                wifiManager.enableNetwork(wifiConfig.networkId, true);
                wifiManager.reconnect();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

private void setIpAssignment(String assign, WifiConfiguration wifiConf) throws Exception {
    WifiConfiguration.IpAssignment ipAssignment = WifiConfiguration.IpAssignment.valueOf(assign);
    wifiConf.ipAssignment = ipAssignment;
    Method setIpAssignment = WifiConfiguration.class.getMethod("setIpAssignment", WifiConfiguration.IpAssignment.class);
    setIpAssignment.invoke(wifiConf, ipAssignment);
}

private void setIpAddress(InetAddress addr, int prefixLength, WifiConfiguration wifiConf) throws Exception {
    Method setIpAddress = WifiConfiguration.class.getMethod("setIpAddress", InetAddress.class, int.class);
    setIpAddress.invoke(wifiConf, addr, prefixLength);
}

private void setGateway(InetAddress gateway, WifiConfiguration wifiConf) throws Exception {
    Method setGateway = WifiConfiguration.class.getMethod("setGateway", InetAddress.class);
    setGateway.invoke(wifiConf, gateway);
}

private void setDNS(InetAddress dns1, InetAddress dns2, WifiConfiguration wifiConf) throws Exception {
    List<InetAddress> dnsList = new ArrayList<InetAddress>();
    dnsList.add(dns1);
    dnsList.add(dns2);
    Method setDns = WifiConfiguration.class.getMethod("setDnsServers", List.class);
    setDns.invoke(wifiConf, dnsList);
}

  • 該方法可以設置設備的靜態 IP 地址,網關,子網掩碼和 DNS
  • 該方法需要在 AndroidManifest.xml 中聲明上述兩個許可權

六、Android 獲取 DNS

可以通過以下代碼獲取設備的 DNS:


public static List<String> getDNS(Context context) {
    List<String> dnsList = new ArrayList<String>();
    WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    DhcpInfo dhcpInfo = wifiMgr.getDhcpInfo();
    int dns1 = dhcpInfo.dns1;
    int dns2 = dhcpInfo.dns2;
    dnsList.add(Formatter.formatIpAddress(dns1));
    dnsList.add(Formatter.formatIpAddress(dns2));
    return dnsList;
} 

  • 該方法返回當前連接的 Wifi 路由器的 DNS 列表
  • 如果設備沒有連接 Wifi,該方法將返回空列表
  • 該方法需要在 AndroidManifest.xml 中聲明上述兩個許可權

七、Android 獲取公網 IP

獲取設備的公網 IP 地址並不是一個簡單的任務,需要藉助第三方服務。下面是一個簡單的獲取公網 IP 的示例。


public static String getPublicIPAddress() {
    String ipAddress = "";
    try {
        URL url = new URL("http://checkip.amazonaws.com");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setConnectTimeout(5000);
        con.setReadTimeout(5000);
        con.setRequestMethod("GET");
        InputStream in = new BufferedInputStream(con.getInputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        ipAddress = reader.readLine();
        reader.close();
        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ipAddress;
} 

  • 該方法返回設備的公網 IP 地址
  • 需要藉助 http://checkip.amazonaws.com 來獲取公網 IP 地址,也可以通過其他類似的第三方服務獲取公網 IP 地址

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/154413.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-16 14:12
下一篇 2024-11-16 14:12

相關推薦

  • cmd看地址

    本文將從多個方面詳細闡述cmd看地址,包括如何查看本機IP地址、如何查看路由器IP、如何查看DNS伺服器IP等等。 一、查看本機IP地址 要查看本機IP地址,首先需要打開cmd窗口…

    編程 2025-04-29
  • 尚矽谷官網地址用法介紹

    尚矽谷是國內一家領先的技術培訓機構,提供了眾多IT職業的培訓,包括Java、Python、大數據、前端、人工智慧等方向。其官網地址為http://www.atguigu.com/。…

    編程 2025-04-29
  • Centos7配置靜態ip

    本文將詳細闡述如何在Centos7系統中配置靜態ip。 一、查看網路介面 在配置靜態ip之前,我們首先需要查看系統中的網路介面,以確定我們需要配置的網卡是哪一個。 ifconfig…

    編程 2025-04-29
  • Python檢測IP連通

    Python是一門強大的編程語言,常用於網路開發、數據分析等領域。IP地址是網路通信的基礎,在網路通信中,有時需要檢測IP地址是否連通。下面將從多個方面介紹Python檢測IP連通…

    編程 2025-04-28
  • Android ViewPager和ScrollView滑動衝突問題

    Android開發中,ViewPager和ScrollView是兩個常用的控制項。但是當它們同時使用時,可能會發生滑動衝突的問題。本文將從多個方面介紹解決Android ViewPa…

    編程 2025-04-28
  • Android如何點擊其他區域收起軟鍵盤

    在Android應用中,當輸入框獲取焦點彈出軟鍵盤後,我們希望能夠點擊其他區域使軟鍵盤消失,以提升用戶體驗。本篇文章將說明如何實現這一功能。 一、獲取焦點並顯示軟鍵盤 在Andro…

    編程 2025-04-28
  • Idea2022變更Git地址

    本文將從以下幾個方面對Idea2022變更Git地址進行詳細闡述: 一、GitHub上修改Git倉庫地址 1、登錄GitHub,找到需要修改的Git倉庫 2、在代碼頁面點擊右上角的…

    編程 2025-04-28
  • Treck TCP/IP Stack 輸入驗證錯誤漏洞CVE-2020-11901解析

    本文將對Treck TCP/IP Stack 輸入驗證錯誤漏洞CVE-2020-11901進行詳細解析,並提供相關代碼示例。 一、漏洞背景 Treck TCP/IP Stack是一…

    編程 2025-04-27
  • electron-egg打包後請求地址錯誤解決方法用法介紹

    本文將從多個方面對electron-egg打包後請求地址錯誤進行詳細闡述,並給出解決方法。 一、electron-egg打包後請求地址錯誤的表現 在使用 electron-egg …

    編程 2025-04-27
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若伺服器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27

發表回復

登錄後才能評論