首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 獲取移動數據(GPRS/4G/5G)下的本機 IP 地址完整方案

     編輯:程式設計綜合問答

問題背景

撥號碼 *#*#4636#*#* 顯示「IP addr not reachable」,無法直接查看移動數據介面的 IP。需在 App 中程式化獲取。

核心代碼(Java/Kotlin 通用)

public String getMobileIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
            NetworkInterface intf = en.nextElement();
            // 過濾回環、下行、非移動介面
            if (intf.isLoopback() || !intf.isUp() || intf.getName().contains("lo")) continue;
            
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (inetAddress.isLoopbackAddress()) continue;
                if (inetAddress instanceof Inet4Address) { // 僅 IPv4
                    return inetAddress.getHostAddress();
                }
            }
        }
    } catch (SocketException ex) {
        Log.e("GetIP", ex.toString());
    }
    return null;
}

關鍵權限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Android 10+ 讀取介面列表需額外權限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

進階:區分 Wi-Fi 與移動數據 IP

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest request = new NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) // 僅移動數據
    .build();
cm.requestNetwork(request, new ConnectivityManager.NetworkCallback() {
    @Override public void onAvailable(Network network) {
        // 綁定到該網絡後再枚舉介面,確保拿到移動數據 IP
        network.bindToSocket(socket); // 或用 network.getNetworkInterfaces()
    }
});

常見坑點

  • 多介面並存:手機同時連 Wi-Fi 和移動數據,枚舉會同時看到 wlan0 和 rmnet0,需按介面名或 NetworkCapabilities 過濾。
  • IPv6 佔優:現代網絡常返回 IPv6,若只需 IPv4 需額外判斷 instanceof Inet4Address。
  • Android 10+ 限制:getNetworkInterfaces() 可能返回空,需改用 ConnectivityManager 綁定網絡後獲取。
  • 私有 IP:移動數據獲取的通常是運營商內網 IP(10.x / 100.64.x),非公網出口 IP;如需公網 IP 必須請求外部服務(如 https://api.ipify.org)。

Kotlin 簡化版

fun getMobileIpv4(): String? = NetworkInterface.getNetworkInterfaces()
    .asSequence()
    .filter { it.isUp && !it.isLoopback }
    .flatMap { it.inetAddresses.asSequence() }
    .filter { it !is Inet6Address && !it.isLoopbackAddress }
    .map { it.hostAddress }
    .firstOrNull()

結合權限配置、介面過濾、版本適配,即可穩定獲取移動數據下的本機 IP。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved