WifiManager
获取 Wi-Fi 的 IP,或使用 ConnectivityManager
结合 NetworkInterface
获取移动数据 网络的 IP。
以下是关于在Android中获取网络IP地址的相关内容:
1、定义:IP地址(Internet Protocol Address)是设备在网络中的唯一标识符,每个连接到互联网的设备都有IP地址,通过该地址可与其他设备通信。
2、分类:一般分为IPv4和IPv6两种格式。
1、场景
确定当前网络类型:需先明确设备连接的是Wi-Fi还是移动网络等。
获取网络连接信息:从系统或相关服务中获取网络连接的详细信息。
提取IP地址:从获取的网络连接信息中准确提取出设备的IP地址。
2、用途
网络通信:在进行网络请求或数据传输时,IP地址是必不可少的。
定位服务:通过IP地址,可以大致确定设备的地理位置。
设备识别:在某些场景下,IP地址可以作为设备的唯一标识。
1、通过WiFiManager获取局域网IP地址
适用情况:适用于获取设备连接到WiFi网络时的局域网IP地址。
代码示例:
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); String ip = String.format("%d.%d.%d.%d", (ipAddress & 0xff), (ipAddress >> 8) & 0xff, (ipAddress >> 16) & 0xff, (ipAddress >> 24) & 0xff); Log.d("MainActivity", "IP Address: " + ip);
2、通过网络信息API获取所有网络接口的IP地址
适用情况:可获取设备上所有网络接口的IP地址,包括有线网络、无线网络等。
代码示例:
try { Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface networkInterface = interfaces.nextElement(); if (networkInterface.isUp() && !networkInterface.isLoopback() && !networkInterface.isPointToPoint() && !networkInterface.isVirtual()) { Enumeration<InetAddress> addresses = networkInterface.getInetAddresses(); while (addresses.hasMoreElements()) { InetAddress inetAddress = addresses.nextElement(); if (inetAddress instanceof Inet4Address) { Log.d("MainActivity", "IP Address: " + inetAddress.getHostAddress()); } } } } } catch (SocketException e) { e.printStackTrace(); }
3、通过访问外网网站获取外网IP地址
适用情况:用于获取设备在公网上的IP地址,即当前Wifi网络真正的网络地址,也就是网络运营商分配给用户的IP地址。
原理及代码示例:通过访问外网网站,从网站返回的数据中解析本地的IP地址,由于在本地无法直接获取外网IP地址,所以需要借助服务器,例如访问淘宝的IP查询接口来获取外网IP地址。
String ipAddress = ""; try { String address = "http://ip.taobao.com/service/getIpInfo2.php?ip=myip"; URL url = new URL(address); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); InputStream inputStream = connection.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int len; byte[] buffer = new byte[1024]; while ((len = inputStream.read(buffer)) != -1) { baos.write(buffer, 0, len); } inputStream.close(); String result = baos.toString("UTF-8"); JSONObject jsonObject = new JSONObject(result); ipAddress = jsonObject.getString("ip"); Log.d("MainActivity", "External IP Address: " + ipAddress); } catch (IOException | JSONException e) { e.printStackTrace(); }
1、为什么有时获取到的IP地址是内网IP,有时是外网IP?
解答:内网IP是设备在局域网中的标识,由路由器等设备分配,用于在局域网内进行通信;而外网IP是设备在公网上的标识,由网络运营商分配,用于在互联网上进行通信,当设备连接到局域网时,获取到的是内网IP;当设备通过路由器等设备连接到公网时,获取到的是外网IP,获取到的IP地址类型取决于设备的网络连接方式和所处的网络环境。
2、使用上述方法获取IP地址时,需要注意哪些权限问题?
解答:在使用上述方法获取IP地址时,需要注意以下权限问题:对于通过WiFiManager
获取局域网IP地址的方法,需要在AndroidManifest.xml文件中添加<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
权限;对于通过网络信息API获取所有网络接口的IP地址的方法,不需要特殊权限,但在某些设备或操作系统版本上可能会受到限制;对于通过访问外网网站获取外网IP地址的方法,需要在AndroidManifest.xml文件中添加<uses-permission android:name="android.permission.INTERNET"/>
权限,从Android 6.0(API级别23)开始,还需要在运行时动态申请权限,否则可能会导致应用崩溃或无法正常运行。