Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get Android WiFi "net.hostname" from code

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 Android app? Not for the purpose of changing it, just for readout.

EDIT:
This is a screenshot of my router's web interface, showing a list of all connected devices. Note the two Android devices on the list -- How can that string be read from Java code running on the device?

Router's connection list

like image 925
TheGraeme Avatar asked Feb 20 '14 04:02

TheGraeme


People also ask

How do I find my WIFI Direct name?

After you turn on wifi on your device, it is send a WIFI_P2P_THIS_DEVICE_CHANGED_ACTION broadcast. You can catch this with a broadcast receiver and you can get a WifiP2pDevice object, that is your device. You will get this call when you register for the WifiP2pBroadcastReceiver, it doesn't matter if wifi is already on.

How to get hostname in Android studio?

Code: InetAddress inetAddr; inetAddr = InetAddress. getByName(host. hostname); String hostname = inetAddr.

How to set hostname in Android?

Starting with Android 6, the network name (host name) can be modified using DeviceConfig. xml. Change the value of key 'Other Settings' > 'MDM Settings' > 'hon_net_hostname' to the required value. This value also supports the macros [MODELNUMBER], [SERIALNUMBER] and [MACADDRESS].


3 Answers

Building off of @Merlevede's answer, here's a quick and dirty way to get the property. It's a private API, so it's subject to change, but this code hasn't been modified since at least Android 1.5 so it's probably safe to use.

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;
    }
}
like image 146
Kevin Coppock Avatar answered Oct 25 '22 12:10

Kevin Coppock


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.

like image 35
ralfoide Avatar answered Oct 25 '22 14:10

ralfoide


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.

like image 6
Merlevede Avatar answered Oct 25 '22 14:10

Merlevede