Android未提供对该API的直接访问, 需要使用反射, 代码较简单, 如下
package club.seliote.hotspotscanner.utils; import android.content.Context;import android.net.wifi.WifiManager; import java.lang.reflect.Method; /** * 用于获取热点状态 */public class GetHotspotState { /** * 获取热点状态 * @return HOTSPOT_STATE的枚举 * @throws Exception, 可能是GlobalApplicationContext或从反射中抛出 */ public static HOTSPOT_STATE getState() throws Exception { // 需要使用getApplicationContext(), 否则将报错 // Error: The WIFI_SERVICE must be looked up on the Application context or memory will leak on devices < Android N. // Try changing to .getApplicationContext() [WifiManagerLeak] WifiManager wifiManager = (WifiManager) GlobalApplicationContext.getContext() .getApplicationContext() .getSystemService(Context.WIFI_SERVICE); // 不允许直接调用, 需要使用反射 Method method = wifiManager.getClass().getMethod("getWifiApState"); int stateCode = (Integer) method.invoke(wifiManager); // 部分API版本可能会有问题, 在这里处理一下 if (stateCode > 10) { stateCode -= 10; } return HOTSPOT_STATE.class.getEnumConstants()[stateCode]; } /** * 获取热点开启状态 * @return 已开启返回true, 否则返回false * @throws Exception, 任何步骤出错将会抛出Exception */ public static boolean isHotsoptOpen() throws Exception { return GetHotspotState.getState() == HOTSPOT_STATE.WIFI_AP_STATE_ENABLED; } }
package club.seliote.hotspotscanner.utils; /** * 热点状态的枚举 */public enum HOTSPOT_STATE { // 正在关闭 WIFI_AP_STATE_DISABLING, // 已关闭 WIFI_AP_STATE_DISABLED, // 正在开启 WIFI_AP_STATE_ENABLING, // 已开启 WIFI_AP_STATE_ENABLED, //错误状态 WIFI_AP_STATE_FAILED }
接下来是获取相关的连接状态, 热点连接状态保存在文件/proc/net/arp中, 如果WiFi是开启的, 该文件保存的将是WiFi下的ARP信息, 所以获取热点连接状态前务必检查热点开启状态, 代码中获取一个 shell 直接 cat 即可, 就不上图了, 其中HW type是硬件类型(hardware type of the address from RFC 826), Flags指内部ARP结构, 当该设备连接时值为0x2, 断开时值为0x0, 由此便可进行热点连接设备的监控