Android获取设备IP地址的示例代码
我们在做Android平台GB28181设备接入模块的时候,上层需要拿到设备的IP地址,废话不多说,分享一段获取设备IP地址的代码:
package com.daniulive.smartpublisher; import android.content.Context; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumeration; public class IPAddrUtils { /** * 获取本机IPv4地址 * * @param context * @return 本机IPv4地址;null:无网络连接 */ public static String getIpAddress(Context context) { if (null == context) return getIpAddress(); // 获取WiFi服务 WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); // 判断WiFi是否开启 if (wifiManager.isWifiEnabled()) { // 已经开启了WiFi WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); String ip = intToIp(ipAddress); return ip; } else { // 未开启WiFi return getIpAddress(); } } private static String intToIp(int ipAddress) { return (ipAddress & 0xFF) + "." + ((ipAddress >> 8) & 0xFF) + "." + ((ipAddress >> 16) & 0xFF) + "." + (ipAddress >> 24 & 0xFF); } /** * 获取本机IPv4地址 * * @return 本机IPv4地址;null:无网络连接 */ public static String getIpAddress() { 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() && !inetAddress.isAnyLocalAddress() && inetAddress instanceof Inet4Address) { return inetAddress.getHostAddress(); } } } } catch (Exception e) { } return null; } }
调用非常简单:
String local_ip_addr = IPAddrUtils.getIpAddress(context_); Log.i(TAG, "initGB28181Agent local ip addr: " + local_ip_addr);
当然有些场景下,不一定可以拿到设备IP,这时候,需要手动设置IP地址到模块。
方法补充:
除了上文的方法,小编还为大家整理了其他Android 获取设备IP的方法,希望对大家有所帮助
获取IP
使用WIFI联网与不使用WIFI,获取到的IP地址不同。因此,需要先判断当前设备通过哪种方式联网,然后再获取对应的IP地址。
判断网络连接类型
通过ConnectivityManager
判断网络连接类型,代码如下:
private fun checkCurrentNetworkType() { val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager connectivityManager.run { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { when (activeNetworkInfo?.type) { ConnectivityManager.TYPE_MOBILE -> { // 通过手机流量 } ConnectivityManager.TYPE_WIFI -> { // 通过WIFI } else -> {} } } else { // Android M 以上建议使用getNetworkCapabilities API activeNetwork?.let { network -> getNetworkCapabilities(network)?.let { networkCapabilities -> if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) { when { networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> { // 通过手机流量 } networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> { // 通过WIFI } } } } } } } }
获取手机卡联网 IP
通过NetworkInterface
获取IPV4地址,代码如下:
NetworkInterface.getNetworkInterfaces().let { loo@ for (networkInterface in Collections.list(it)) { for (inetAddresses in Collections.list(networkInterface.inetAddresses)) { if (!inetAddresses.isLoopbackAddress && !inetAddresses.isLinkLocalAddress) { // IP地址 val mobileIp = inetAddresses.hostAddress break@loo } } } }
获取WIFI联网 IP
通过ConnectivityManager
或WifiManager
来获取IP地址,代码如下:
private fun getWIFIIp() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager // IP 地址 val wifiIp = Formatter.formatIpAddress(wifiManager.connectionInfo.ipAddress) } else { // Android Q 以上建议使用getNetworkCapabilities API val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager connectivityManager.run { activeNetwork?.let { network -> (getNetworkCapabilities(network)?.transportInfo as? WifiInfo)?.let { wifiInfo -> // IP 地址 val wifiIp = Formatter.formatIpAddress(wifiInfo.ipAddress) } } } } }
到此这篇关于Android获取设备IP地址的示例代码的文章就介绍到这了,更多相关Android获取IP地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
使用Android Studio Gradle实现友盟多渠道打包
这篇文章主要介绍了使用Android Studio Gradle实现友盟多渠道打包,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-05-05Android studio 切换flutterSDK之后报错及解决办法(推荐)
这篇文章主要介绍了Android studio 切换flutterSDK之后报错及解决办法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-07-07android BitmapFactory.Options使用方法详解
这篇文章主要为大家详细介绍了android BitmapFactory.Options使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-01-01Android持久化技术之SharedPreferences存储实例详解
这篇文章主要介绍了Android持久化技术之SharedPreferences存储,结合实例形式较为详细的分析了SharedPreferences存储的原理、应用及具体实现方法,需要的朋友可以参考下2016-01-01
最新评论