package me.bello.viptv.util;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.util.Log;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
/**
* @Info 获取设备IP地址
* @Author Bello
* @Time 21-1-8 上午10:18
* @Ver
*/
public class IpHelper {
/**
* 获取当前ip地址
* @return
*/
public static String getLocalIpAddress(Context context) {
NetworkInfo info = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if (info != null && info.isConnected()) {
if (info.getType() == ConnectivityManager.TYPE_MOBILE) { //3G/4G网络
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 instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException e) {
Log.e("getLocalIpAddress", "获取3G/4G网络IP失败");
}
} else if (info.getType() == ConnectivityManager.TYPE_WIFI) { // wifi
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String ipAddress = int2ip(wifiInfo.getIpAddress());
return ipAddress;
} else if (info.getType() == ConnectivityManager.TYPE_ETHERNET) { //有线
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
Network network = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
network = mConnectivityManager.getActiveNetwork();
LinkProperties linkProperties = mConnectivityManager.getLinkProperties(network);
for (LinkAddress linkAddress : linkProperties.getLinkAddresses()) {
InetAddress address = linkAddress.getAddress();
if (address instanceof Inet4Address) {
return address.getHostAddress();
}
}
} else {
return getLocalIp();
}
return "0.0.0.0";
}
} else {
return "0.0.0.0";
}
return "0.0.0.0";
}
/**
* 得到有线网关的IP地址
* @return
*/
private static String getLocalIp() {
try {
// 获取本地设备的所有网络接口
Enumeration<NetworkInterface> enumerationNi = NetworkInterface.getNetworkInterfaces();
while (enumerationNi.hasMoreElements()) {
NetworkInterface networkInterface = enumerationNi.nextElement();
String interfaceName = networkInterface.getDisplayName();
Log.i("tag", "网络名字" + interfaceName);
// 如果是有限网卡
if (interfaceName.equals("eth0")) {
Enumeration<InetAddress> enumIpAddr = networkInterface.getInetAddresses();
while (enumIpAddr.hasMoreElements()) {
// 返回枚举集合中的下一个IP地址信息
InetAddress inetAddress = enumIpAddr.nextElement();
// 不是回环地址,并且是ipv4的地址
if (!inetAddress.isLoopbackAddress()
&& inetAddress instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return "0.0.0.0";
}
/**
* 将ip的整数形式转换成ip形式
* @param ipInt
* @return
*/
private static String int2ip(int ipInt) {
StringBuilder sb = new StringBuilder();
sb.append(ipInt & 0xFF).append(".");
sb.append((ipInt >> 8) & 0xFF).append(".");
sb.append((ipInt >> 16) & 0xFF).append(".");
sb.append((ipInt >> 24) & 0xFF);
return sb.toString();
}
}