Android, lokale IP-Adresse und Subnetzmaske für WLAN erkennen, sowohl beim Tethering als auch beim Herstellen einer Verbindung zum Zugriffspunkt

Ich muss die lokale IP-Adresse erkennenund Subnetzmaske im WiFi-Netzwerk, auf einem Android-Gerät (um die UDP-Broadcast-Adresse genau für das lokale Subnetz zu berechnen).

Wenn das Gerät an einen Access Point angeschlossen ist, funktioniert Folgendes ordnungsgemäß:

// Only works when NOT tethering
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

DhcpInfo dhcp = wifi.getDhcpInfo();
if (dhcp == null)
    throw new IOException("No DHCPInfo on WiFi side.");

foo(dhcp.ipAddress, dhcp.netmask);

Aber es funktioniert nicht, wenn es das Android-Gerät ist, das einen Access Point obwohl Tethering bereitstellt: DhcpInfo scheint Informationen zu enthalten, die vom DHCP-Server festgelegt wurden, wenn das Android-Gerät ein Client davon ist, nicht wenn es das Android-Gerät selbst ist, das den DHCP-Dienst bereitstellt . Beim Anbinden ist die vielversprechendste Lösung, die ich finden konnte:

// No way to get subnet mask
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

WifiInfo info = wifi.getConnectionInfo();
if (info == null)
   throw new IOException("No connection info on WiFi side.");

foo(info.getIpAddress(), info.??? /* netmask*/ );

BEARBEITE: FALSCH, in meinen Tests funktioniert das auch nur, wenn NICHT angebunden wird. Während des Tetherings ist die IP immer 0.

Aber es gibt nichts wieWifiInfo.getNetMask(), wie kann ich in diesem Fall die Subnetzmaske erhalten? (Diese Abwesenheit kommt mir sehr seltsam vor, da es dort eine Fülle anderer Informationen gibt. Fehlt mir etwas Offensichtliches?)

Auch im Idealfall hätte ich gerne eine Lösung, die nicht unterscheiden muss, ob das Android-Gerät Tethering bereitstellt, und einfach die lokale IP-Adresse und die Subnetzmaske im WLAN-Netzwerk abruft, auf jeden Fall beide, wenn das Android-Gerät stellt einen Access Point zur Verfügung oder ist Kunde eines solchen.

Selbst Standard-Java (d. H. Nicht Android-spezifisch)NetworkInterface.getNetworkInterfaces(), scheint keine Möglichkeit zu haben, die Subnetzmaske abzurufen (abgesehen davon, dass nicht unterschieden werden darf, welche dem WiFi entspricht). Was vermisse ich

Antworten auf die Frage(2)

Ihre Antwort auf die Frage