当前位置: 首页 > 面试题库 >

Android:如何知道IP地址是Wifi IP地址?

奚修伟
2023-03-14
问题内容

我想知道Android设备的IP地址是数据IP还是Wifi IP。

1)首先将设备连接到3G,然后将设备分配给网络IP。
2)之后将设备连接到WIFI,现在该设备将分配给WIFI IP。
3)任何可以让我们知道IP地址是Wifi IP地址还是网络IP的Android API?

在2.3.5中使用了下面的代码,一切都很好,但是在4.0.3中,ICS存在一些问题。

   /**
 * Is the IP Address a a Wifi Ip Address.
 * @param ipAddr
 * @return boolean
 */
public boolean isWifiIp(byte[] ipAddr){
    try{
        WifiManager mgr = (WifiManager)mCxt.getSystemService(Context.WIFI_SERVICE);
        int wifiIP = mgr.getConnectionInfo().getIpAddress();
        int reverseWifiIP = Integer.reverseBytes(wifiIP);  
        int byteArrayToInt = byteArrayToInt(ipAddr,0);

        if(byteArrayToInt == wifiIP || byteArrayToInt == reverseWifiIP)
            return true;
    }catch (Exception e) {
        Logger.d(TAG, e);
    }
    return false;
}


/**
 * Convert IP Address in bytes to int value.
 * @param arr
 * @param offset
 * @return int
 */
public static final int byteArrayToInt(byte[] arr, int offset) {
    if (arr == null || arr.length - offset < 4)
        return -1;

    int r0 = (arr[offset] & 0xFF) << 24;
    int r1 = (arr[offset + 1] & 0xFF) << 16;
    int r2 = (arr[offset + 2] & 0xFF) << 8;
    int r3 = arr[offset + 3] & 0xFF;
    return r0 + r1 + r2 + r3;
}

/**
 *  Fetches the IP Address of the Client. There is Delay of 2 Seconds for the API to return.
 */
public String getClientIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if(isWifiIp(inetAddress.getAddress())){
                    Logger.d(TAG, "-------- Local IP Address; Not Valid: "+inetAddress.getHostAddress());
                    continue;
                }
                if (!inetAddress.isLoopbackAddress()) {
                    String ipAddress = Formatter.formatIpAddress(inetAddress.hashCode());
                    Logger.d(TAG, "-------- Some Valid IPv4 is ---"+ipAddress);
                    return ipAddress;
                }
            }
        }
    } catch (SocketException ex) {
        Logger.e(TAG, ex.toString());
    }
    return null;
}

请帮助

4)当我关闭移动数据网络并打开Wifi时,我仍然得到一些有效的IPv4地址,该地址在2.3.5及以下版本中找不到。

谢谢


问题答案:

找到了窍门。.http:
//developer.android.com/reference/java/net/NetworkInterface.html#getName()

WiFi的getName将以wlan ..开头,使用此验证WiFi IP。



 类似资料:
  • 问题内容: 我已经在Web项目的jsp / servlet中创建了一个登录应用程序,我想知道访问我的登录页面的不同用户的地理位置。我怎么知道某个人正在从哪里访问我的登录页面?例如:如果某人正在访问加拿大的页面,那么一条记录将插入到我的数据库中,例如:IP:20.4.9.134和位置:Canada。 问题答案: 我用这个: http://freegeoip.net/xml/122.169.8.137

  • 问题内容: 我使用这部分代码来ping通Java中的ip地址,但只有ping通本地主机才能成功,而对于其他主机,程序会说该主机不可访问。我禁用了防火墙,但是仍然有此问题 输出为: 问题答案: 根据javadoc: “如果可以获取特权,典型的实现将使用ICMP ECHO REQUEST,否则它将尝试在目标主机的端口7(Echo)上建立TCP连接。” 选项1(ICMP)通常需要管理权限。

  • 我必须在ConsumerGroup中设置zookeeper IP地址,而不是Kafka-Host IP地址。因为我将复制因子设置为3,并且创建了3个代理。因此,如果一个主机出现故障,那么另一个主机可以接管。 当我尝试将zookeeper的IP地址而不是Kafka-Host的IP地址放在ConsumerGroup中时,它不会接收到任何来自生产者API的消息。 我希望这样,如果我在ConsumerGr

  • 我有一个运行WebIOPi的覆盆子Pi,它连接到一个中继板,通过基于网络的界面打开和关闭东西。下面是浏览器中的界面: 一切都很好,但我想创建一个android应用程序,只需通过WebView显示基于Web的界面。我以前用过WebView,它看起来很简单,但我不能让它工作。 下面是我的代码: 我补充道: 到舱单上。

  • 需求是当本地程序请求一个IP地址的时候,映射到另一个ip地址上去。 和DNS不同的是,这里没有解析域名,因此修改hosts不行。 有没有办法或者工具可以做到?