Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过以太网电缆连接时获取Android设备IPv4地址_Java_Android - Fatal编程技术网

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
的地址,但它与我从设备状态中看到的地址不匹配。无论如何,谢谢你的帮助。