1. 程式人生 > >Android 熱點相關操作

Android 熱點相關操作

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 熱點相關操作