Android开发之WiFi模块我爱编程

Android-WiFi开发之 WiFi广播监听(格式化版)

2018-05-25  本文已影响387人  迷你小猪

引子

过程

关于网络开发, 你可能会用到的广播

    IntentFilter filter = new IntentFilter();
    filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
    filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
    filter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
    filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
    filter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
    filter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
    filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
    filter.addAction(WifiManager.RSSI_CHANGED_ACTION);

ConnectivityManager 的一些说明:

    // 获取 ConnectivityManager 对象. 
    public static ConnectivityManager getConnectivityManager(Context context) {
        return context == null ? null : (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    }
    // 获取默认的连接方式: 
    public static NetworkInfo getDefaultNetwork(ConnectivityManager manager) {
        return manager == null ? null : manager.getActiveNetworkInfo();
    }
    
    // 默认网络是否连接: 
    public static boolean isDefaultNetworkConnected(NetworkInfo info) {
        return info != null && info.isConnected() && info.isAvailable();
    }
    
    // 默认网络是有线网: 
    public static boolean isDefaultNetworkIsEthernet(NetworkInfo info) {
        return info != null && info.getType() == ConnectivityManager.TYPE_ETHERNET;
    }
    
    // 默认网络是无线网: 
    public static boolean isDefaultNetworkIsWifi(NetworkInfo info) {
        return info != null && info.getType() == ConnectivityManager.TYPE_WIFI;
    }
    
    // 有线网是否连接: 
    public static boolean isEthernetConnected(ConnectivityManager manager) {
        return manager != null && manager.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET) != null && manager.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET).isConnected;
    }
    
    // 无线网是否连接: 
    public static boolean isWifiConnected(ConnectivityManager manager) {
        return manager != null && manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null && manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected;
    }

关于 action 的一些说明:

  1. 通过第一步, 已经可以静态获取当前的网络连接了, 而在实际开发过程中, 在很多情况下, 是需要动态刷新状态的, 那么就依赖到 Android 的广播机制了.

  2. 广播机制是 Android 中重要的机制之一, 在跨进程方面的表现也是相当乐观的, 不仅是安卓刚入门还是精通安卓开发的高级工程师, 对此机制应该都是津津乐道的. 一方面是简单易用, 另一方面, 对于进程通知, 调度, 数据传递都存在非常大的意义.

  3. 那么, 说回来了, 既然要动态监听, 那么我们应该怎么做呢, 当然是动态监听系统发出的广播了;下面就把开发中你可能需要用到的广播做一小说明:

    ConnectivityManager.CONNECTIVITY_ACTION
    WifiManager.WIFI_STATE_CHANGED_ACTION
    WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
    WifiManager.NETWORK_IDS_CHANGED_ACTION
    WifiManager.SUPPLICANT_STATE_CHANGED_ACTION
    WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION
    WifiManager.LINK_CONFIGURATION_CHANGED_ACTION
    WifiManager.NETWORK_STATE_CHANGED_ACTION
    WifiManager.RSSI_CHANGED_ACTION
    // 是否无连接.
    public static boolean isNoConnectivity(Intent intent) {
        return intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
    }
    
    // 获取当前网络信息. 
    public static NetworkInfo getExtraNetworkInfo(Intent intent) {
        return intent.getPacelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
    }
    
    // 获取当前网络状态. 
    public static NetworkInfo.State getNetState(NetworkInfo info) {
        return info == null ? null : info.getState();
    }
    
    // 获取当前网络类型. 
    public static int getNetState(NetworkInfo info) {
        return info == null ? -1 : info.getType();
    }
    // 通过 intent 获取当前WIFI状态. 
    public static int getWifiStateByIntent(Intent intent) {
        return intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
    }
    
    // 通过 WifiManager 获取当前WIFI状态. 
    public static int getWifiStateByWifiManager(WifiManager manager) {
        return manager == null ? WifiManager.WIFI_STATE_UNKNOWN : manager.getState();
    }
    
    // 获取WIFI前一时刻状态. 
    public static int getWifiPreviousState(Intent intent) {
        return intent.getIntExtra(WifiManager.EXTRA_PREVIOUS_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
    }
其中:
 0 --> WiFiManager.WIFI_STATE_DISABLING, 表示 WiFi 正关闭的瞬间状态;
 1 --> WifiManager.WIFI_STATE_DISABLED, 表示 WiFi 模块已经完全关闭的状态; 
 2 --> WifiManager.WIFI_STATE_ENABLING, 表示 WiFi 模块正在打开中瞬间的状态; 
 3 --> WiFiManager.WIFI_STATE_ENABLED, 表示 WiFi 模块已经完全开启的状态;
 4 --> WiFiManager.WIFI_STATE_UNKNOWN, 表示 WiFi 处于一种未知状态; 通常是在开启或关闭WiFi的过程中出现不可预知的错误, 通常是底层状态机可能跑的出现故障了, 会到这种情况, 与底层控制相关; 
    // 获取 ScanResult 列表: 
    public static List<ScanResult> getScanResultForWifi(WifiManager manager) {
        return manager == null ? null : manager.getScanResult();
    }

    // result 是否更新: 
    public static boolean isResultUpdated(Intent intent) {
        return intent != null && intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false);
    }
adb shell 
$ cat /data/misc/wifi/wpa_supplicant.conf
    // 获取当前网络新状态. 
    public static SupplicantState getCurrentNetworkState(Intent intent) {
        return intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE);
    }
    
    // 获取当前网络连接状态码. 
    public static int getCurrentNetworkCode(Intent intent) {
        return int netConnectErrorCode = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 0);
    }
    
    // 当前网络是否连接失败
    public static boolean isCurrentNetworkConnectFailed(intent intent) {
        return WifiManager.ERROR_AUTHENTICATING == getCurrentNetworkCode(intent);
    }
    // 是否多重网络发生变化. 
    public static boolean isMultipleNetworkChanged(Intent intent) {
        return intent.getBooleanExtra(WifiManager.EXTRA_MULTIPLE_NETWORKS_CHANGED, false);
    }
    
    // 获取当前最新网络配置: 
    public static WifiConfiguration getCurWifiConfig(Intent intent) {
        return intent.getParcelableExtra(WifiManager.EXTRA_WIFI_CONFIGURATION);
    }
    // 获取 LinkProperties 
    public static LinkProperties getLinkProperties(Intent intent) {
        return intent.getParcelableExtra(WifiManager.EXTRA_LINK_PROPERTIES);
    }
    
    // 获取 NetworkCapabilities
    public static NetworkCapabilities getNetworkCapabilities(Intent intent) {
        return intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_CAPABILITIES);
    }
    // 获取当前网络
    public static NetworkInfo getCurrentNetworkInfo(Intent intent) {
        return intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
    }
    
    // 获取当前网路状态. 
    public static NetworkInfo.State getCurrentNetworkState(NetworkInfo info) {
        return info != null ? info.getState() : null;
    }
    
    // 获取当前网路BSSID.
    public static String getCurrentNetworkBssid(Intent intent) {
        return intent.getStringExtra(WifiManager.EXTRA_BSSID);
    }
    
    // 获取当前网路的WifiInfo. wifi 连接成功有效.
    public static WifiInfo getCurrentWifiInfo(Intent intent) {
        return intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
    }
// 获取当前热点最新的信号强度
public static int getCurrentNetworkRssi(Intent intent) {
    return intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -1000);
}

小结:

  1. 如上, 针对原生 Android Settings源代码, 结合 SDK 中给出的官方 javadoc 整合出, 无线网络开发中常用的广播. WLAN 开放热点, 是另外的功能, 有所区别, 在之后会单独整合出来, 如上, 感谢~~~

  2. 如有疑问, 请简信, 或邮箱告知. 亦可下方评论区留言.

  3. outlook 邮箱: Benjie1017@outlook.com

  4. qq 邮箱: 1281641968@qq.com

上一篇下一篇

猜你喜欢

热点阅读