Насколько я знаю, есть два способа получить имя интерфейса адаптера Wi-Fi на устройстве Android, используя Java.Через любой интерфейс Wi-Fi:
- MAC-адрес, через IP-адрес WifiInfo getMacAddress ()
- , через getIpAddress () * 1009 WifiInfo*
Если у вас есть какая-либо информация, вы можете использовать NetworkInterface , чтобы выяснить остальное.
Опция № 1, через MAC-адрес, вероятно, лучший вариант .MAC-адреса всегда доступны, даже если устройство отсутствует в сети.Для некоторых людей может быть желательно получить имя интерфейса, когда устройство не подключено к сети.MAC-адреса никогда не меняются, и если так редко.Выполнение этого через MAC-адрес адаптера Wi-Fi обещает быть более надежным.
Вот пример того, как получить имя интерфейса Wi-Fi через его MAC-адрес.Это расширение оригинального ответа Xion .
protected String wifiInterfaceName(final Context context) {
// Get WiFi interface's MAC address as a BigInteger.
WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String wifiMacString = wifiInfo.getMacAddress();
byte[] wifiMacBytes = macAddressToByteArray(wifiMacString);
BigInteger wifiMac = new BigInteger(wifiMacBytes);
String result = null;
try {
List<NetworkInterface> networkInterfaces
= Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface currentInterface : networkInterfaces) {
byte[] hardwareAddress = currentInterface.getHardwareAddress();
if (hardwareAddress != null) {
BigInteger currentMac = new BigInteger(hardwareAddress);
if (currentMac.equals(wifiMac)) {
result = currentInterface.getName();
break;
}
}
}
} catch (SocketException ex) {
Log.e("WifiGet", "Socket excpetion: " + ex.getMessage());
}
return result;
}
protected byte[] macAddressToByteArray(String macString) {
String[] mac = macString.split("[:\\s-]");
byte[] macAddress = new byte[6];
for (int i = 0; i < mac.length; i++) {
macAddress[i] = Integer.decode("0x" + mac[i]).byteValue();
}
return macAddress;
}
Вариант № 2, через IP-адрес, довольно хорошо объяснен в разделе вопросов: Get Wifi Interfaceимя на Android .При попытке получить имя интерфейса Wi-Fi по IP-адресу следует учитывать несколько моментов:
- Работает только при подключении устройства к сети Wi-Fi.
- IP-адреса меняются, поэтому очень маловероятно, что ваша операция не будет работать, если вы поймете, что устройство меняет IP-адрес.
- Этот я все еще пытаюсь выяснить.Но могут быть проблемы с порядком работы различных устройств и результатом WifiInfo getIpAddress () .Опять же, я не уверен.Все, что я точно знаю, это то, что мне нужно изменить порядок байтов, чтобы получить фактический IP-адрес.
Следующий пример основан на вопросительной части Получить имя интерфейса Wi-Fiна Android
protected String wifiInterfaceName2(final Context context) {
WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
// Convert little-endian to big-endianif needed
if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) {
ipAddress = Integer.reverseBytes(ipAddress);
}
byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
String result;
try {
InetAddress addr = InetAddress.getByAddress(bytes);
NetworkInterface netInterface = NetworkInterface.getByInetAddress(addr);
result = netInterface.getName();
} catch (UnknownHostException ex) {
LOG.error("Unknown host.", ex);
result = null;
} catch (SocketException ex) {
LOG.error("Socket exception.", ex);
result = null;
}
return result;
}
Помните, что оба сегмента кода представлены только в качестве примера.Обязательно очистите код, добавьте обработку ошибок и проверьте, планируете ли вы использовать любой из них в рабочей среде.
О, и не забудьте добавить соответствующие разрешения для вашего AndroidManifest.xml .Я думаю, что они что-то вроде:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Кроме того, эти примеры будут работать только на реальном устройстве.На эмуляторах нет Wi-Fi.