Java 通过以太网电缆连接时获取Android设备IPv4地址
我正在开发一个安卓应用程序,它将在安卓电视盒上运行,我的设备可以通过Java 通过以太网电缆连接时获取Android设备IPv4地址,java,android,Java,Android,我正在开发一个安卓应用程序,它将在安卓电视盒上运行,我的设备可以通过Wifi或Ethernet电缆连接到网络。我需要获取设备IPv4地址,现在我可以通过Wifi连接设备时获取地址,但通过以太网电缆连接时无法获取地址 我的最低SDK版本是24,目前我控制着我的应用程序将运行的设备,我的目标Android版本是7.1和8.0 当设备连接到Wifi时,我使用下面的代码获取设备IPv4地址,但我找不到类似的以太网电缆代码 WifiManager=(WifiManager)getSystemService
Wifi
或Ethernet
电缆连接到网络。我需要获取设备IPv4
地址,现在我可以通过Wifi
连接设备时获取地址,但通过以太网
电缆连接时无法获取地址
我的最低SDK版本是24,目前我控制着我的应用程序将运行的设备,我的目标Android版本是7.1和8.0
当设备连接到Wifi
时,我使用下面的代码获取设备IPv4
地址,但我找不到类似的以太网
电缆代码
WifiManager=(WifiManager)getSystemService(WIFI_服务);
WifiInfo WifiInfo=manager.getConnectionInfo();
int ipInt=wifiInfo.getIpAddress();
字符串ip=InetAddress.getByAddress(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putin(ipInt.array()).getHostAddress();
我需要一种方法来检测我的设备是否通过Wifi
或Ethernet
连接,并正确获取IPv4
。公共静态字符串getIpAddress(){
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 instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException ex) {
ex.printStackTrace();
}
return null;
}
试一试{
对于(枚举en=NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){
NetworkInterface intf=en.nextElement();
对于(枚举Enumeration EnumipAddress=intf.getInetAddresses();EnumipAddress.hasMoreElements();){
InetAddress InetAddress=enumIpAddr.nextElement();
如果(!inetAddress.isLoopbackAddress()&&inetAddress instanceof Inet4Address){
返回inetAddress.getHostAddress();
}
}
}
}捕获(SocketException例外){
例如printStackTrace();
}
返回null;
}
编辑:
在清单中添加Internet权限以使其工作:
<uses-permission android:name="android.permission.INTERNET" />
这在任何情况下都会有帮助。您应该尝试如下所示的方法 检查设备是否连接到Wi-Fi。如果是,您所做的那一部分工作非常好,但如果不是,请尝试下面代码中的其他部分 步骤-1:
步骤-2:
ConnectivityManager connManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_服务);
NetworkInfo mWifi=connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
字符串ip=null;
if(mWifi.isConnected()){
WifiManager=(WifiManager)getSystemService(WIFI_服务);
WifiInfo WifiInfo=manager.getConnectionInfo();
int ipInt=wifiInfo.getIpAddress();
ip=InetAddress.getByAddress(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putin(ipInt.array()).getHostAddress();
}
否则{
试一试{
对于(枚举en=NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){
NetworkInterface intf=en.nextElement();
对于(枚举Enumeration EnumipAddress=intf.getInetAddresses();EnumipAddress.hasMoreElements();){
InetAddress InetAddress=enumIpAddr.nextElement();
如果(!inetAddress.isLoopbackAddress()){
ip=inetAddress.getHostAddress();
Log.i(标签,“****IP=“+IP”);
}
}
}
}捕获(SocketException例外){
Log.e(TAG,例如toString());
}
}
返回ip;
感谢您的帮助,它工作正常。缺少的只有一件小事,您需要在清单
文件中添加INTERNET
权限,否则将引发异常。请使用此次要信息更新您的答案,以便我将其标记为已接受的答案。@Ebraheem我很高兴它有帮助!!感谢您的帮助,我尝试了您的解决方案,但出现了一个错误错误:找不到符号方法formatIpAddress(int)
,似乎formatIpAddress
功能已被删除。当设备通过以太网
电缆连接时,它会给我类似于IPv6
的地址,但它与我从设备状态中看到的地址不匹配。无论如何,谢谢你的帮助。