Get Android WiFi “net.hostname” from code

前端 未结 7 1556
北荒
北荒 2021-01-31 22:43

When an Android device connects to a wifi AP, it identifies itself with a name like:

android_cc1dec12345e6054

How can that string be obtained from within an Andr

相关标签:
7条回答
  • 2021-01-31 23:10

    I used jiangze ren's answer and modified it.

    Now you can get hostname by getting IP address of device:

       WifiManager wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
                            final String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
                            InetAddress address = InetAddress.getByName(ip);
                            System.out.println(address.getHostName());  // <-- host name is here and not localhost!
    
    0 讨论(0)
  • 2021-01-31 23:13

    you can use the code below:

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

    And actually, you can more info using this function. such as... other devices hostname which are in the same network.

    0 讨论(0)
  • 2021-01-31 23:15

    Try this:

    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");
                }
    
    0 讨论(0)
  • 2021-01-31 23:23

    Use the NetworkInterface object to enumerate the interfaces and get the canonical host name from the interfaces' InetAddress. Since you want the wifi name, as a shortcut you can query for wlan0 directly and if that fails you can enumerate them all like this:

    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());
                    }
                }
            }
        }
    }
    

    That will give you an output like this:

    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
    

    Tip: if InetAddress.getCanonicalHostName().equals(InetAddress.getHostAddress()) you can ignore it as it's not a "real" name.

    0 讨论(0)
  • 2021-01-31 23:26

    For java:

    you can get the property by below:

    String str = SystemProperties.get("net.hostname");
    
    0 讨论(0)
  • 2021-01-31 23:27

    I don't know if this helps but here I go.

    From a unix shell (you can download any Terminal app in Google Play), you can get the hostname by typing

    getprop net.hostname
    

    Of course this is not what you want... but... on the other hand, here is information on how to execute a unix command from java. Maybe by combining these two you get what you're looking for.

    0 讨论(0)
提交回复
热议问题