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:無網(wǎng)絡連接
*/
public static String getIpAddress(Context context) {
if (null == context)
return getIpAddress();
// 獲取WiFi服務
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
// 判斷WiFi是否開啟
if (wifiManager.isWifiEnabled()) {
// 已經(jīng)開啟了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:無網(wǎng)絡連接
*/
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;
}
}
調(diào)用非常簡單:
String local_ip_addr = IPAddrUtils.getIpAddress(context_); Log.i(TAG, "initGB28181Agent local ip addr: " + local_ip_addr);
當然有些場景下,不一定可以拿到設備IP,這時候,需要手動設置IP地址到模塊。
方法補充:
除了上文的方法,小編還為大家整理了其他Android 獲取設備IP的方法,希望對大家有所幫助
獲取IP
使用WIFI聯(lián)網(wǎng)與不使用WIFI,獲取到的IP地址不同。因此,需要先判斷當前設備通過哪種方式聯(lián)網(wǎng),然后再獲取對應的IP地址。
判斷網(wǎng)絡連接類型
通過ConnectivityManager判斷網(wǎng)絡連接類型,代碼如下:
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
}
}
}
}
}
}
}
}
獲取手機卡聯(lián)網(wǎng) 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聯(lián)網(wǎng) 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地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android Studio將AAR包發(fā)布到Maven本地倉庫的流程步驟
Android AAR文件是Android Archive文件的縮寫,是一種Android應用程序存檔文件格式,類似于JAR文件格式,它在Android Studio中被廣泛使用,本文給大家介紹了Android Studio將AAR包發(fā)布到Maven本地倉庫的流程步驟,需要的朋友可以參考下2025-03-03
Android自定義View實現(xiàn)帶4圓角或者2圓角的效果
這篇文章主要介紹了Android自定義View實現(xiàn)帶4圓角或者2圓角的效果,本文通過實例代碼截圖給大家展示的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
Android進階Handler應用線上卡頓監(jiān)控詳解
這篇文章主要為大家介紹了Android進階Handler應用線上卡頓監(jiān)控詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
使用Android開發(fā)接入第三方原生SDK實現(xiàn)微信登錄
這篇文章主要介紹了使用Android開發(fā)接入第三方原生SDK實現(xiàn)微信登錄,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03

