Android自动连接指定的WiFi热点
“Android自动连接指定的WiFi热点”,看上去这是个再基础不过的功能了。很多人都觉得很简单,网上也有大量的资料。但在以Android作为底层系统的硬件设备的连接上,特别针对我们自主开发的轻推投屏盒子为例,这个技术是比较重要的一个点。接下来我就以轻推投屏盒子为例,讲讲Android系统连接WiFi热点的一些难点。
推投屏盒子有两张无线网卡,一个负责对外上网,一个负责对内提供AP局域网。这样的设计是为了在没有外网的环境下也能够实现投屏功能(避免了很多市面上的投屏盒子的缺点。比如必须连接WiFi,并且不支持8021x/eap的WiFi连接),通过连接轻推投屏盒子的AP,实现某些公司需要的公司内网认证。
好了,接下来进入正题,上网WiFi我们使用Android系统的提供WiFi模块管理——WiFiManager。
WiFiManager:是系统提供给开发者使用的系统服务管理类,WifiManager会调用service和framework层, 驱动层进行函数调用,
然后驱动层会回调至上层, 以广播的形式实现通知。简单来说就是,只需要使用WifiManager进行函数操作完成UI, 监听对应的广播消息, 就可完成功能了。
笔者所用到方法:
WiFiManager.startScan():开始扫描WiFi,扫描结果通过广播通知
WiFiManager.disconnect():断开网络WiFi
WiFiManager.addNetwork(WifiConfiguration config):添加WiFi配置,返回networkId
WiFiManager.enableNetwork(networkId, true):允许与以前配置的网络相关联,并尝试连接WiFi
WiFiManager.getScanResults():获取设备缓存的扫描结果,这里部分手机的缓存会很少,跟实际扫描结果不一致,这个时候需要调用一次扫描更新缓存
第一步:获取WiFiManager
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
第二步:获取扫描结果缓存
ScanResult.SSID 表示WiFi名,这里需要注意有"",如果界面需要显示,那么得把这个去掉,连接的时候这个得保留才行
ScanResult.BSSID mac,表示WiFi的唯一标识,
ScanResult.frequency 表示WiFi的频率
ScanResult.level 表示WiFi的信号强度,这里为负数,越大表示信号越好
List<ScanResult> scanResults = wifiManager.getScanResults();
第三步:连接WiFi
/**
* wif连接
*
* @param scanResult ScanResult
* @param userName String eap连接需要的用户名
* @param pass String 密码
* @return 操作结果
*/
public boolean connectionWifi(ScanResult scanResult,String userName,String pass) {
WifiConfiguration config = getWifiConfig(ScanResult scanResult,String userName,String pass);
networkId = wifiManager.addNetwork(config);
wifiManager.saveConfiguration();
return wifiManager.enableNetwork(networkId, true);
}
工具方法
判断WiFi类型
/**
* 获取wifi安全类型.
*
* @param result ScanResult
* @return 0
*/
public static int getSecurity(ScanResult result) {
if (null != result && null != result.capabilities) {
if (result.capabilities.contains("WEP")) {
return SECURITY_WEP;
} else if (result.capabilities.contains("PSK")) {
return SECURITY_PSK;
}