从代码获取Android WiFi“net.hostname”

当一个Android设备连接到一个无线接入点,它标识自己的名字,如:

android_cc1dec12345e6054

如何从Android应用程序中获取该string? 不是为了改变它,只是为了读出。

编辑:
这是我的路由器的Web界面的屏幕截图,显示所有连接的设备的列表。 请注意列表上的两个Android设备 – 如何从设备上运行的Java代码读取该string?

路由器的连接列表

Solutions Collecting From Web of "从代码获取Android WiFi“net.hostname”"

根据@ Merlevede的回答,这是一个快速和肮脏的方式来获得财产。 这是一个私人的API,所以它可能会改变,但这个代码至less从Android 1.5以来没有被修改,所以它可能是安全的使用。

import android.os.Build; import java.lang.reflect.Method; /** * Retrieves the net.hostname system property * @param defValue the value to be returned if the hostname could * not be resolved */ public static String getHostName(String defValue) { try { Method getString = Build.class.getDeclaredMethod("getString", String.class); getString.setAccessible(true); return getString.invoke(null, "net.hostname").toString(); } catch (Exception ex) { return defValue; } } 

使用NetworkInterface对象来枚举接口,并从接口的InetAddress获取规范的主机名。 既然你想wifi的名字,作为一个快捷方式,你可以直接查询wlan0 ,如果失败,你可以枚举他们都是这样的:

 import android.test.InstrumentationTestCase; import android.util.Log; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumeration; public class NetworkInterfaceTest extends InstrumentationTestCase { private static final String TAG = NetworkInterfaceTest.class.getSimpleName(); public void testNetworkName() throws Exception { Enumeration<NetworkInterface> it_ni = NetworkInterface.getNetworkInterfaces(); while (it_ni.hasMoreElements()) { NetworkInterface ni = it_ni.nextElement(); Enumeration<InetAddress> it_ia = ni.getInetAddresses(); if (it_ia.hasMoreElements()) { Log.i(TAG, "++ NI: " + ni.getDisplayName()); while (it_ia.hasMoreElements()) { InetAddress ia = it_ia.nextElement(); Log.i(TAG, "-- IA: " + ia.getCanonicalHostName()); Log.i(TAG, "-- host: " + ia.getHostAddress()); } } } } } 

这会给你一个这样的输出:

 TestRunner﹕ started: testNetworkName ++ NI: lo -- IA: ::1%1 -- host: ::1%1 -- IA: localhost -- host: 127.0.0.1 ++ NI: p2p0 -- IA: fe80::1234:1234:1234:1234%p2p0 -- host: fe80::1234:1234:1234:1234%p2p0 ++ NI: wlan0 -- IA: fe80::1234:1234:1234:1234%wlan0 -- host: fe80::1234:1234:1234:1234%wlan0 -- IA: android-1234567812345678 <--- right here -- host: 192.168.1.234 

提示:如果InetAddress.getCanonicalHostName().equals(InetAddress.getHostAddress()) ,则可以忽略它,因为它不是“真正的”名称。

我不知道这是否有帮助,但我在这里。

从unix shell(你可以在Google Play下载任何terminal应用程序),你可以input主机名

 getprop net.hostname 

当然,这不是你想要的…但是另一方面, 这里是关于如何从java执行unix命令的信息。 也许通过结合这两个你得到你在找什么。

对于java

您可以通过以下方式获取该物业:

 String str = SystemProperties.get("net.hostname"); 

尝试这个:

 Class<?> c = Class.forName("android.os.SystemProperties"); Method get = c.getMethod("get", String.class, String.class); String serialNumber = (String) get.invoke(c, "net.hostname", "Error"); if (serialNumber.equals("Error")) { serialNumber = (String) get.invoke(c, "net.hostname", "Error"); } 

你可以使用下面的代码:

 InetAddress address = InetAddress.getLocalHost(); System.out.println(address.getHostName()); // <-- host name is here! 

而实际上,你可以使用这个function更多的信息。 如…在同一networking中的其他设备主机名。