在Android上获取Wifi接口名称

3
我正在开发一种类似于WiFi嗅探器的工具。为了实现这个目标,我使用了一个编译为ARM架构的tcpdump二进制文件。但前提是我需要知道WiFi接口的名称。
根据SDK文档中NetworkInterface提供了getName()方法。我计划使用这个方法,所以第一步是获取与我的WiFi接口对应的NetworkInterface对象。为了做到这一点,我使用WifiInfo获取IP地址,然后获取与此IP地址对应的InetAddress,最后使用静态方法getByInetAddress(InetAddress address)获取NetworkInterface的实例。
以下是我的代码:
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
InetAddress addr = InetAddress.getByAddress(bytes);
NetworkInterface netInterface = NetworkInterface.getByInetAddress(addr);
Log.e("MyTemp",netInterface.getName());

输出结果:

输出:

SSID: Nancy-Universite, BSSID: 00:19:30:6a:a9:40, MAC: B4:07:F9:D5:7C:8C, Supplicant    state: COMPLETED, RSSI: -80, Link speed: 11, Net ID: 6

但我期望得到类似这样的结果:

eth0

我也尝试了isVirtual()方法,但它无法编译,我收到了一个错误消息,说该方法不适用于NetworkInterface类型。 我不明白发生了什么...
任何帮助都将不胜感激。


这取决于手机,对我来说是eth0,你可以通过adb运行netcfg命令来显示网络接口列表。 - a.b.d
如何在Java中获取wifi网络接口名称与此问题相关,但不是完全重复的。在这里,我特别询问了Android而不是如何在普通Java中执行它。其他问题值得一读,但我认为当特定的Android API可用时,应该使用它们,因为它们应该更可靠。 - a.b.d
@a.b.d 你能否从接口列表中找出如何区分Wi-Fi的接口?当用户离线时,你的解决方案是否也适用? - Shobhit Puri
6个回答

4

您需要做的就是更改

Log.e("MyTemp",netInterface.getName());

to

Log.e("MyTemp",netInterface.getDisplayName());

从文档中:在Android上,这个字符串与{@link #getName}返回的字符串相同。 - Kevin Coppock

2

试试这个

for(Enumeration<NetworkInterface> list = NetworkInterface.getNetworkInterfaces(); list.hasMoreElements();)
    {
            NetworkInterface i = list.nextElement();
            Log.e("network_interfaces", "display name " + i.getDisplayName());
    }

1
使用以下代码: String interfaceName = SystemInfo.getInstance().getProperty("wifi.interface");
这一定会起作用的。

这在安卓上不可用。 - bk138
该值可通过getprop获得。不过我很想知道这在所有设备上有多常见。这种方法的优点是它可以在Wi-Fi关闭时工作,而其他所有答案都源于Chloe所说的内容。 - Rob Pridham

0

试试这个:

ls /sys/class/ieee80211/*/device/net/

非root权限,在Android 4、Android 7.1、Android 9和Arch Linux上进行了测试。


0
你可以调用/system/ip link并解析结果。
bash-3.2# ip link
ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: usb0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 6e:3d:7a:3a:62:ee brd ff:ff:ff:ff:ff:ff
3: usb1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether da:bb:3f:04:1b:cd brd ff:ff:ff:ff:ff:ff
4: sit0: <NOARP> mtu 1480 qdisc noop state DOWN
    link/sit 0.0.0.0 brd 0.0.0.0
5: ip6tnl0: <NOARP> mtu 1460 qdisc noop state DOWN
    link/tunnel6 :: brd ::
6: ifb0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 32
    link/ether 76:3c:4e:23:cc:f8 brd ff:ff:ff:ff:ff:ff
7: ifb1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 32
    link/ether 02:17:54:31:ff:bd brd ff:ff:ff:ff:ff:ff
8: tun: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 500
    link/ether b2:b7:11:da:7c:6a brd ff:ff:ff:ff:ff:ff
16: tiwlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100
    link/ether 40:fc:89:e4:67:4c brd ff:ff:ff:ff:ff:ff

0

关于这个问题的所有答案都不是直截了当的。 但是您可以通过反射实现这一点。下面提到的代码将在没有 wifi 连接时也能正常工作。

    String interfaceName=null;
        try {
            Method m = Class.forName("android.os.SystemProperties").getMethod("get", String.class);
            interFace = (String) m.invoke(null, "wifi.interface");
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println("Wifi Interface Name: " + interfaceName);

它可以在所有的API级别上运行(即使您的targetsdk是30,尽管反射中添加了一些限制)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接