Android 熱點相關操作
阿新 • • 發佈:2018-07-15
get can fail tsp chan ces androi ack java
Android未提供對該API的直接訪問, 需要使用反射, 代碼較簡單, 如下
GetHotspotState.java
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; } }
HOTSPOT_STATE.java
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, 由此便可進行熱點連接設備的監控
Android 熱點相關操作