ホットスポットをホストしているときに、デバイスの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();
}
}
}
}
これは非常にうまく機能しますが、wifi NetworkInterface
の名前はデバイスによって異なります。そのため、最初にデバイスのWi-Fi NetworkInterface
名(ホットスポット用)を見つける必要があります。この名前を見つけるにはどうすればよいですか?または、デバイスのIPアドレスを見つけるためのより良いアプローチはありますか?
/// MACによる正しいIPアドレスの検索も機能していないようです
最近、WifiAPのIPアドレスが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
最初は、WiFiインターフェイスのMACアドレスを取得して、各インターフェイスのMACアドレスと比較しようとしました。しかし、少なくともCMを実行しているN4では、ホットスポットをオンにするとWiFiインターフェイスのMACが変化することがわかりました。
そこで、デバイスのリストを調べて、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;
}
1つのインターフェースのみがすべての条件に一致します:wlan0
。
考えられる他の解決策:
最も一般的なインターフェイス名をいくつか調べて、リストから見つけてみてください。new String[] { "wlan0", "eth0", ...];
これはあなたを助けることができます。
シェルを呼び出してネットワークアダプタを要求し、この場合のように必要なものを確認するのは無線LANなので、このコードに従ってください
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();
添付メモ
または、Playストアの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を取得したいが、接続されたデバイスで取得する方法がわからない場合に機能します(ほとんどの場合、サーバーの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();
}
}
一度このコードを試してください:
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でコードを記述して、ホットスポットが有効になっていないことを確認します。
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();
}
intf.getName()
をintf.getDisplayName()
に置き換えてから試してください。
user2224350は次のように述べています。「最近、WifiAPのIPアドレスがAndroidでハードコードされていることがわかりました。」
ユーザーがこの値を手動で変更しない限り(これは非常にまれだと思います)、ハードコードされた値を使用するだけで十分です。これが最善の方法だと思います。 IPアドレスは「192.168.43.1」です ここに表示されているように 。
これは私のSamsungA3とHuaweiPRA-LX1で機能しますが、HTC Desires530は192.168.1.1
も返します。