我正在开发一个Android应用程序,其中手机连接到wifi网络或充当wifi接入点。我需要获得正确的接口名称。当手机连接到mac上的wifi网络时,接口名称为'eth0',当它作为接入点时,它是'wl0.1'。
我使用NetworkInterface.getNetworkInterfaces()找到它,它列出了所有接口。我只想获得有效的wifi界面名称。对此有何帮助?
答案 0 :(得分:2)
NetworkInterface
有getHardwareAddress
用于返回接口的硬件(MAC)地址。表示当前Wi-Fi状态(由WifiInfo
获取)的WifiManager.getConnectionInfo
具有getMacAddress
方法。只需使用后者即可找到您的Wi-Fi接口。
请记住,在比较地址时,您应该将它们转换为通用格式,因为getHardwareAddress
返回字节数组,而getMacAddress
返回带冒号分隔的十六进制值的字符串。
答案 1 :(得分:1)
据我所知,有两种方法可以使用Java在Android设备上获取Wi-Fi适配器的接口名称。通过Wi-Fi接口:
获得任何一条信息后,您可以使用NetworkInterface来确定其余信息。
选项#1,通过MAC地址,可能是最佳选择。即使设备不在网络上,MAC地址也始终可用。当设备未连接到网络时,某些人实际上可能需要获取接口名称。 MAC地址永远不会改变,如果很少。因此,通过Wi-Fi适配器的MAC地址实现这一目标将更加强大。
以下是如何通过其MAC地址获取Wi-Fi接口名称的示例。这是 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 name on Android的问题部分中得到了很好的解释。尝试通过IP地址获取Wi-Fi接口名称时,需要注意以下几点:
以下示例基于Get Wifi Interface name on 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。
答案 2 :(得分:0)
任何没有root用户的Android版本:
ls /sys/class/ieee80211/*/device/net/
如果设备名称以 wl 开头是无线的。哦, p2p 。 例如:wlan0,wlp2s0等