Android Найти ip-адрес устройства, когда он размещает точку доступа

Мне нужно найти ip-адрес устройства, когда он размещает точку доступа. Я использовал этот код до сих пор:

//if is using Hotspot for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); if (intf.getName().contains("wlan")) { for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress() && (inetAddress.getAddress().length == 4)) { return inetAddress.getHostAddress(); } } } } 

Это работает очень хорошо, но имя сети Wi-Fi Wi-Fi отличается на некоторых устройствах. Поэтому сначала я должен найти имя Wi-Fi NetworkInterface Wi-Fi NetworkInterface (для своей горячей точки). Как я могу найти это имя? Или есть лучший подход для поиска IP-адреса устройства?

/// Поиск правильного IP-адреса с помощью MAC также не работает

    Сначала я попытался получить MAC-адрес интерфейса WiFi, чтобы сравнить его с MAC-адресом каждого интерфейса. Но оказывается, что по крайней мере на моем N4 запуске CM MAC-интерфейс WiFi меняется при включении Точки доступа.

    Поэтому я написал некоторый код, чтобы пройти через список устройств, чтобы найти что-то, чтобы идентифицировать интерфейс wifi. Этот код отлично работает на моем N4:

     private String getWifiIp() throws SocketException { for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { NetworkInterface intf = en.nextElement(); if (intf.isLoopback()) { continue; } if (intf.isVirtual()) { continue; } if (!intf.isUp()) { continue; } if (intf.isPointToPoint()) { continue; } if (intf.getHardwareAddress() == null) { continue; } for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { InetAddress inetAddress = enumIpAddr.nextElement(); if (inetAddress.getAddress().length == 4) { return inetAddress.getHostAddress(); } } } return null; } 

    Только один интерфейс соответствует всем условиям: wlan0 .

    Возможное другое решение:

    Пройдите через некоторые наиболее распространенные имена интерфейсов и попытайтесь найти их в списке: new String[] { "wlan0", "eth0", ...];

    Недавно я выяснил, что IP-адрес WifiAP жестко запрограммирован в Android. Если пользователь не изменил это значение вручную (я думаю, что это очень редко), использование жестко заданного значения является абсолютно достаточным. Я думаю, что это лучший способ пойти. IP-адрес: «192.168.43.1»: https://github.com/CyanogenMod/android_frameworks_base/blob/cm-10.1/wifi/java/android/net/wifi/WifiStateMachine.java?source=c#L1299

    Это может помочь вам.

    Выполнение вызова оболочки для запроса сетевых адаптеров и проверки тех, которые вам нужны, в этом случае – wlan, поэтому следуйте этому коду

     Process p=Runtime.getRuntime().exec("ip link show | grep -o \": wlan[0-9]:\" "); BufferedReader readCommandOutput = new BufferedReader(new InputStreamReader(p.getInputStream())); String line=null; while((line=readCommandOutput.readLine())!=null){ // Lines containing wlan will be returned // parse to get the name of that interface. String interface=line.split(":")[1]; //this is the interface you need. } if (line==null){ //nothing was found. } readCommandOutput.close(); в Process p=Runtime.getRuntime().exec("ip link show | grep -o \": wlan[0-9]:\" "); BufferedReader readCommandOutput = new BufferedReader(new InputStreamReader(p.getInputStream())); String line=null; while((line=readCommandOutput.readLine())!=null){ // Lines containing wlan will be returned // parse to get the name of that interface. String interface=line.split(":")[1]; //this is the interface you need. } if (line==null){ //nothing was found. } readCommandOutput.close(); 

    Прикрепленные примечания

    Это изображение является результатом команды на оболочке. Или вы можете использовать эмулятор терминала Android из магазина воспроизведения, чтобы запустить эту команду в оболочке android.

    Для получения IP-адреса

     WifiManager wifi=(WifiManager)getSystemService(WIFI_SERVICE); int address=wifi.getDhcpInfo().ipAddress; Toast.makeText(this,intToIP(address),1).show(); public String intToIP(int i) { return ((i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + ((i >> 24) & 0xFF)); } 

    Это решение работает, когда вы хотите получить ip-адрес устройства hotspot на том же устройстве, но не знаете, как его получить на подключенном устройстве (в основном ip-сервер – 192.168.43.1, вы можете получить работу, выполняемую с помощью жесткого кодирования)

      public void serverip() { DhcpInfo dhcpInfo = wifiManager.getDhcpInfo(); if (dhcpInfo==null){ Toast.makeText(MainActivity.this, "No ip for server", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, "ip of server "+android.text.format.Formatter.formatIpAddress(dhcpInfo.gateway), Toast.LENGTH_SHORT).show(); } } 

    Пожалуйста, замените intf.getName() на intf.getDisplayName() а затем попробуйте.

    Попробуйте этот код:

     public String getLocalIpAddress() { 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()) { String ip = Formatter.formatIpAddress(inetAddress.hashCode()); Toast.makeText(getApplicationContext(), "***** IP="+ ip, 1).show(); return ip; } } } } catch (SocketException ex) { Toast.makeText(getApplicationContext(), "***** IP="+ex.toString(), 1).show(); } return null; } 

    Напишите код в oncreat для проверки, hotspot is Enable не …..

     WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); wifiManager.setWifiEnabled(true); wifiManager.setWifiEnabled(false); boolean wifiEnabled = wifiManager.isWifiEnabled(); if (wifiEnabled) { Toast.makeText(getApplicationContext(),"on",Toast.LENGTH_SHORT).show(); getLocalIpAddress(); }else { Toast.makeText(getApplicationContext(),"off",Toast.LENGTH_SHORT).show(); }