Android 13(SDK33)无Root获取热点连接设备列表的替代方案
无Root权限下Android 13(SDK 33)获取热点连接设备列表的替代方案
针对Android 13(SDK 33)中读取ARP表、执行ip neigh命令失效的问题,目前有一个无需Root权限的官方替代方案:利用WifiManager.SoftApCallback监听热点连接状态,直接获取连接设备的MAC和IP地址。
实现步骤:
1. 声明必要权限
在AndroidManifest.xml中添加以下权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- Android 12+ 需添加此权限,无需位置权限 --> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" />
2. 注册SoftAp回调监听设备连接
通过WifiManager注册SoftApCallback,当有设备连接/断开热点时,onConnectedClientsChanged方法会被回调,返回所有当前连接的设备信息:
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); // 主线程Handler用于回调处理 Handler mainHandler = new Handler(Looper.getMainLooper()); wifiManager.registerSoftApCallback(new WifiManager.SoftApCallback() { @Override public void onConnectedClientsChanged(List<WifiManager.ClientInfo> connectedClients) { super.onConnectedClientsChanged(connectedClients); // 遍历并处理每个连接的设备 for (WifiManager.ClientInfo client : connectedClients) { String macAddr = client.getMacAddress(); // 将整数IP转换为字符串格式 String ipAddr = Formatter.formatIpAddress(client.getIpAddress()); Log.d("HotspotClients", "设备MAC: " + macAddr + ", IP: " + ipAddr); } } @Override public void onSoftApStateChanged(int state, int failureReason) { super.onSoftApStateChanged(state, failureReason); // 可在此监听热点的开启/关闭状态,例如: if (state == WifiManager.WIFI_AP_STATE_ENABLED) { Log.d("HotspotState", "热点已开启"); } } }, mainHandler);
关键说明:
- 该API从Android 11(SDK 30)开始提供,完全兼容SDK 33,属于官方合法接口,无需Root权限
ClientInfo对象直接提供了MAC地址(getMacAddress())和IP地址(getIpAddress()),正好满足需求- Android 12+ 要求的
NEARBY_WIFI_DEVICES权限,通过设置neverForLocation可以避免申请位置权限,符合隐私规范 - 原方案失效原因:Android 13加强了系统资源访问限制,普通应用已无法读取ARP表或执行
ip neigh这类系统命令获取设备信息
内容的提问来源于stack exchange,提问作者Han Wei Ho
相关产品推荐
相关产品推荐

