Получить Android WiFi «net.hostname» из кода

Когда устройство Android подключается к AP Wi-Fi, оно идентифицирует себя с таким именем, как:

android_cc1dec12345e6054

Как эта строка может быть получена из приложения Android? Не с целью его изменения, просто для считывания.

РЕДАКТИРОВАТЬ:
Это скриншот веб-интерфейса моего маршрутизатора, показывающий список всех подключенных устройств. Обратите внимание на два Android-устройства в списке. Как эта строка может быть прочитана из кода Java, запущенного на устройстве?

Список соединений маршрутизатора

Основываясь на ответе @ Merlevede, вот быстрый и грязный способ получить собственность. Это частный API, поэтому он может быть изменен, но этот код не был изменен с по крайней мере 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 и если это 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 (вы можете загрузить любое приложение терминала в Google Play), вы можете получить имя хоста, набрав

 getprop net.hostname 

Конечно, это не то, что вы хотите … но … с другой стороны, вот информация о том, как выполнить команду unix из java. Возможно, объединив эти два, вы получите то, что ищете.

Для 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! 

И на самом деле, вы можете узнать больше об этой функции. Такие как … другие имена устройств, которые находятся в одной сети.