liubobuzhidao

android之系统开发(wifi相关)

开始之前需要知道几个广播:

1
2
3
4
5
6
7
8
9
10
11
WifiManager.WIFI_STATE_CHANGED_ACTION //这个监听wifi的打开与关闭,与wifi的连接无关
WifiManager.NETWORK_STATE_CHANGED_ACTION
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION
WifiManager.SUPPLICANT_STATE_CHANGED_ACTION
ConnectivityManager.CONNECTIVITY_ACTION //
WifiManager.RSSI_CHANGED_ACTION
android.net.wifi.WIFI_AP_STATE_CHANGED
  1. WifiManager.WIFI_STATE_CHANGED_ACTION

    ​ wifi硬件模块状态改变的广播,比如wifi打开、关闭,官方给出的状态还有WiFiManager.WIFI_STATE_DISABLING, 表示 WiFi 正关闭的瞬间状态; WifiManager.WIFI_STATE_DISABLED, 表示 WiFi 模块已经完全关闭的状态; WifiManager.WIFI_STATE_ENABLING, 表示 WiFi 模块正在打开中瞬间的状态; WiFiManager.WIFI_STATE_ENABLED, 表示 WiFi 模块已经完全开启的状态;WiFiManager.WIFI_STATE_UNKNOWN, 表示 WiFi 处于一种未知状态[不可预知的错误,与硬件厂商有关];

  1. WifiManager.NETWORK_STATE_CHANGED_ACTION

    ​ wifi连接的时候状态发生改变发出的广播,从intent中获取WifiInfo信息,然后可以通过WifiInfo得到当前的状态,如果这个新的状态是SupplicantState.COMPLETED,那么就可以拿到当前的连接信息,获取wifiInfo对应的key为EXTRA_WIFI_INFO,此处不需要先获取networkInfo,通过这个对象来判断是否连接成功,因为通过测试可得networkInfo.getState()的值一旦是CONNECTED,那么wifiInfo就不为null,可以直接获取该值。

    1
    2
    3
    4
    WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
    if (null != wifiInfo && wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
    String ssid = wifiInfo.getSSID();
    }
  2. WifiManager.SCAN_RESULTS_AVAILABLE_ACTION

    ​ 扫描到一个热点,并且此热点可用时会发出此广播,你可以从intent中获取到一个boolean值,如果此值为false表示此次扫描不成功,如果为true表示此次扫描成功。

    1
    2
    List<ScanResult> results = wifiManager.getScanResult();
    boolean updateScanResult = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED);
  3. WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION

    ​ 对于已经发生SupplicantState改变的网络已经完全连接或者已经完全失去连接所触发的广播,可以通过intent获取当前的状态值。

    1
    boolean connectResult = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false);
  4. WifiManager.SUPPLICANT_STATE_CHANGED_ACTION

    对于已建立好的连接,如果它的状态发生改变就会发出这个广播,比如说连上了一个公共的wifi,例如CMCC,你需要认证以后才能使用,如何判断当前wifi是否是这种网络,就可以通过这个广播来获取NetWork是否可用,

    1
    2
    SupplicantState netNewState = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE);
    int netConnectErrorCode = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, WifiManager.ERROR_AUTHENTICATING);//获取出错描述状态码
  5. ConnectivityManager.CONNECTIVITY_ACTION

    网络连接发生了变化的监听,通常是默认的连接类型已经建立连接或者已经失去联系会触发的广播,对于连接失败, 你从 intent 中取出的 ConnectivityManager.EXTRA_NO_CONNECTIVITY 为 true; 对于连接成功, 你从 intent 中可以取出 ConnectivityManager.EXTRA_NETWORK_INFO, 返回NetWorkInfo,

  6. WifiManager.RSSI_CHANGED_ACTION

    信号强度发生改变时触发的广播,可以获取到最新的rssi信息。

  7. WIFI_AP_STATE_CHANGED

    WiFi - AP 发生改变所触发的广播