Android wifi模块
来源:互联网 发布:ubuntu 设置ntp客户端 编辑:程序博客网 时间:2024/05/21 11:35
工具api
1.开发细节 1 获取WifiManager入口类实例:
wifiManager = (WifiManager) context .getSystemService(Context.WIFI_SERVICE);
2.打开及关闭wifi
wifiManager.setWifiEnabled(true)
true表示打开wifi开关,false表示关闭,该方法的返回值仅代表操作是否成功,不代表wifi状态的变化;
通过监听广播WifiManager.WIFI_STATE_CHANGED_ACTION ,来判断真正的wifi开关变化,该广播带有一个int型的值来表示wifi状态:
int wifistate = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED); switch (wifistate) { case WifiManager.WIFI_STATE_DISABLED: //wifi已关闭 break; case WifiManager.WIFI_STATE_ENABLED: //wifi已打开 break; case WifiManager.WIFI_STATE_ENABLING: //wifi正在打开 break; default: break; }
可以看到,该操作其实是一个异步操作,一般耗时在1~3秒之间。
————————————————–
3.周围热点扫描
wifiManager.startScan()
以上方法为开始扫描的接口,其返回值代表操作是否成功,扫描结果通过另外一个接口获取:
List<ScanResult> results = wifiManager.getScanResults();
一般在主动调用startScan之后,大概2秒左右,会收到WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)广播通知,该广播包括一个boolean型的额外参数:
boolean isScanned = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, true);
上面的值表示,扫描结果是否已可用,若可用,则可以使用getScanResults获取结果,在结果没有就绪之前,会返回null。
一般系统本身会调用startScan接口,而该操作相对比较耗电,因此在应用中要酌情使用,并不需要频繁调用。
————————————————–
4. 获取已连接过的热点
所有已经连接过的热点,都会存在本地一个文件中,一般路径为/data/misc/wifi/wpa_supplicant.conf(查看需root),而在程序中获取则通过以下接口:
List<WifiConfiguration> configurations = wifiManager.getConfiguredNetworks();
获取到的WiFiConfiguration对象中,只有ssid和networkId是一定有的,可以用于直###接连接该热点,其他信息如bssid,密钥等信息基本都是空的。(如何直接连接热点,下###文叙述)
—————————————————
5.获取当前wifi连接信息
WifiInfo info = wifiManager.getConnectionInfo();
该对象代表当前已连接的热点,信息,无连接时返回null;
该对象可获取包括ssid,bssid,networkId等信息,而ssid是包括了双引号的,###如“CCMC”,在之前的扫描结果ScanResult中,ssid并不带双引号。
6 连接指定热点
连接一个未连接过的热点时,需3步:
1)创建一个配置:WifiConfiguration
public WifiConfiguration createConfiguration(AccessPoint ap) { String SSID = ap.getSsid(); WifiConfiguration config = new WifiConfiguration(); config.SSID = "\"" + SSID + "\""; String encryptionType = ap.getEncryptionType(); String password = ap.getPassword(); if (encryptionType.contains("wep")) { /** * special handling according to password length is a must for wep */ int i = password.length(); if (((i == 10 || (i == 26) || (i == 58))) && (password.matches("[0-9A-Fa-f]*"))) { config.wepKeys[0] = password; } else { config.wepKeys[0] = "\"" + password + "\""; } config.allowedAuthAlgorithms .set(WifiConfiguration.AuthAlgorithm.SHARED); config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; } else if (encryptionType.contains("wpa")) { config.preSharedKey = "\"" + password + "\""; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); } else { config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); } return config; }
网上流传多处创建configuration的代码,但大都未经过验证,以上代码已经经过了线####上版本测试,准确可用。
判断加密类型的方式,可以优化,本处仅示例。*
2)生成一个networkId
WifiConfiguration config = createConfiguration(ap); /** * networkId is bigger than 0 in most time, 0 in few time and smaller than 0 in no time */ int networkId = networkId = wifiManager.addNetwork(config);
一般情况下,对一个已经连接过的热点(本地有连接记录),进行以上操作时,在####api21及以上会返回一个小于0的networkId,此时,进行下一步连接是没有意义的,获得一个小于0的networkId已经表示连接失败。
3)开始连接
wifiManager.enableNetwork(networkId, true)
连接结果通过两个广播反馈:WifiManager.NETWORK_STATE_CHANGED_ACTION和WifiManager.SUPPLICANT_STATE_CHANGED_ACTION
其中,密码错误的结果通知需通过第二个广播判断:
int error = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 0); if (WifiManager.ERROR_AUTHENTICATING == error) { //密码错误,认证失败 }
其他结果均通过第一个广播接收:
if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if (null != info) { NetworkInfo.DetailedState state = info.getDetailedState(); }}
public enum DetailedState { /** Ready to start data connection setup. */ IDLE, /** Searching for an available access point. */ SCANNING, /** Currently setting up data connection. */ CONNECTING, /** Network link established, performing authentication. */ AUTHENTICATING, /** Awaiting response from DHCP server in order to assign IP address information. */ OBTAINING_IPADDR, /** IP traffic should be available. */ CONNECTED, /** IP traffic is suspended */ SUSPENDED, /** Currently tearing down data connection. */ DISCONNECTING, /** IP traffic not available. */ DISCONNECTED, /** Attempt to connect failed. */ FAILED, /** Access to this network is blocked. */ BLOCKED, /** Link has poor connectivity. */ VERIFYING_POOR_LINK, /** Checking if network is a captive portal */ CAPTIVE_PORTAL_CHECK }
7.断开当前wifi连接
wifiManager.disconnect()
8 .遗忘一个已连接过的热点
boolean isRemoved = wifiManager.removeNetwork(networkId)
阅读全文
0 0
- Android Wifi模块分析
- android wifi模块分析
- Android WIFI 模块分析
- Android wifi模块
- Android WIFI模块分析
- Android wifi模块解析
- android wifi模块分析
- Android WIFI模块分析
- Android WIFI模块分析
- Android WIFI模块分析
- android Wifi模块分析
- Android Wifi模块学习
- Android Wifi模块分析
- Android WIFI模块分析
- android wifi模块分析
- Android Wifi模块学习
- Android WIFI模块分析
- Android WIFI模块分析
- 如何设置Ubuntu 自动待机时间
- 完成端口之个人理解
- 冒泡排序
- Nginx与tomcat组合的简单使用
- 网易新闻排行榜爬虫
- Android wifi模块
- C++设计模式二--OberverPattern(观察者模式)
- 向量的表示、投影、变换、协方差矩阵及PCA
- (二)hadoop配置虚拟机环境
- AndroidM及以上,接听电话之后5S 灭屏
- CRC校验
- ES6学习之路(六) Proxy 代理器&Reflect
- 带你玩转“数据卫士”Data Guard
- 服务器负载过高问题分析