方法1:
- Java code
public String getLocalIpAddress() { 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 (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } } } } catch (SocketException ex) { Log.e(LOG_TAG, ex.toString()); } return null; }
方法2:
- Java code
WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress();
wifi的网络,得到一个int值,要再写个int转换ip的方法,就可以得到ip地址了:
- Java code
public static String longToIP(long longIp) {// linux long是低位在前,高位在后StringBuffer sb = new StringBuffer("");// 将高24位置0sb.append(String.valueOf((longIp & 0x000000FF)));sb.append(".");// 将高16位置0,然后右移8位sb.append(String.valueOf((longIp & 0x0000FFFF) >>> 8));sb.append(".");// 将高8位置0,然后右移16位sb.append(String.valueOf((longIp & 0x00FFFFFF) >>> 16));sb.append(".");// 直接右移24位sb.append(String.valueOf((longIp >>> 24)));return sb.toString();}
我通过textView将这两个方法获取的ip都显示出来,一般情况下在手机运营商网络或者wifi的环境下,这两个个方法获取的ip都相同,问题来了,当手机通过vpn代理联网时,这两种方法获取的ip地址就不同了...纠结中,为何呢?
------解决方案--------------------
方法1通过NetworkInterface得到的IP地址,在打开VPN的情况下,会得到连上VPN之后从VPN服务器获得的地址。此时wifi网络只是跳板,真正连接的是VPN通道。
方法2直接和wifi模组沟通,读取当前的局域网IP,不受VPN影响。
所以打开VPN之后,两个方法得到的结果不一样。