我目前正在使用

public static String getLocalIPAddress(WifiManager wm){
    return Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
}

获取执行设备的IP地址。如果该设备连接到“通用” WLAN网络,并且该设备连接到由另一个Android设备通过热点托管的wifi网络,则效果很好。如果设备未连接到任何wifi网络,则返回“0.0.0.0”(正确)。但是,如果设备通过提供热点来托管wifi网络,则该方法仍将返回“0.0.0.0”。如何在“自己的wifi网络”中获取热点提供设备的真实IP地址?

问候与问候

最佳答案

您几乎是对的,热点的默认IP地址是192.168.43.1(如果设备制造商未更改)。

您可以检查Android框架(AOSP)的源代码。
/frameworks/base/services/java/com/android/server/connectivity/Tethering.java/frameworks/base/wifi/java/android/net/wifi/WifiStateMachine.java
在Tethering.java中,

private static final String USB_NEAR_IFACE_ADDR      = "192.168.42.129";
private static final int USB_PREFIX_LENGTH        = 24;

// USB is  192.168.42.1 and 255.255.255.0
// Wifi is 192.168.43.1 and 255.255.255.0
// BT is limited to max default of 5 connections. 192.168.44.1 to 192.168.48.1
// with 255.255.255.0

private String[] mDhcpRange;
private static final String[] DHCP_DEFAULT_RANGE = {
    "192.168.42.2", "192.168.42.254", "192.168.43.2", "192.168.43.254",
    "192.168.44.2", "192.168.44.254", "192.168.45.2", "192.168.45.254",
    "192.168.46.2", "192.168.46.254", "192.168.47.2", "192.168.47.254",
    "192.168.48.2", "192.168.48.254",
};

另外,在WifiStateMachine.java中
private boolean startTethering(ArrayList<String> available) {

    boolean wifiAvailable = false;

    checkAndSetConnectivityInstance();

    String[] wifiRegexs = mCm.getTetherableWifiRegexs();

    for (String intf : available) {
        for (String regex : wifiRegexs) {
            if (intf.matches(regex)) {

                InterfaceConfiguration ifcg = null;
                try {
                    ifcg = mNwService.getInterfaceConfig(intf);
                    if (ifcg != null) {
                        /* IP/netmask: 192.168.43.1/255.255.255.0 */
                        ifcg.setLinkAddress(new LinkAddress(
                                NetworkUtils.numericToInetAddress("192.168.43.1"), 24));
                        ifcg.setInterfaceUp();

                        mNwService.setInterfaceConfig(intf, ifcg);
                    }
                } catch (Exception e) {
                    loge("Error configuring interface " + intf + ", :" + e);
                    return false;
                }

                if(mCm.tether(intf) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
                    loge("Error tethering on " + intf);
                    return false;
                }
                mTetherInterfaceName = intf;
                return true;
            }
        }
    }
    // We found no interfaces to tether
    return false;
}

因此,默认值为192.168.43.1

09-10 05:54
查看更多