本案例实现安卓自动搜索附近wifi和连接wifi,参考了网上很多人的做法,最终总结出来的一套个人觉得比较清晰的案例,给大家分享一下,最终做成jar包给unity服务。
一:wifi涉及到的权限
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />允许程序改变网络连接状态
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 允许程序改变Wi-Fi连接状态
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 获取网络信息状态
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 获取当前WiFi接入的状态以及WLAN热点的信息
<uses-permission android:name="android.permission.WAKE_LOCK" /> 允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失
<uses-permission android:name="android.permission.INTERNET" /> 访问网络连接
二:android系统相关wifi类
WifiManager
wifi管理的API,包括wifi的扫描,建立连接,配置,断开连接等等。
wifiManager.isWifiEnabled();//判断是否开启
wifiManager.setWifiEnabled(true);//设置开启关闭
注意,调用setWifiEnabled后,系统进行wifi模块的开启需要一定时间,此时通过wifiManager.getWifiState()获取的状态来判断是否完成。
WifiManager.WIFI_STATE_DISABLED : WIFI网卡不可用(1)
WifiManager.WIFI_STATE_DISABLING : WIFI网卡正在关闭(0)
WifiManager.WIFI_STATE_ENABLED : WIFI网卡可用(3)
WifiManager.WIFI_STATE_ENABLING : WIFI网正在打开(2) (WIFI启动需要一段时间)
WifiManager.WIFI_STATE_UNKNOWN : 未知网卡状态
具体参考:http://developer.android.com/reference/android/net/wifi/WifiManager.html
WifiInfo
描述已经建立连接的wifi信息。包括ip,mac地址,连接速度
具体参考:http://developer.android.com/reference/android/net/wifi/WifiInfo.html
ConnectivityManager
监控网络连接,当网络连接发生变化时返送广播,当一个网络请求连接失败的时候他会自动转到其他可连接网络等等
获取方式Context.getSystemService(Context.CONNECTIVITY_SERVICE)
具体参考:https://developer.android.com/reference/android/net/ConnectivityManager.html
WifiLock (WifiManager.WifiLock)
它是wifiManager里面的一个类。服务于WifiManager。当无线wifi有一段事件没用的时候系统可能会自动关闭,WifiLock 可以让无线wifi保持唤醒状态
具体参考:https://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html
ScanResult(包是:android.net.wifi。不要import错包,因为蓝牙包中android.blutooth.le也有这个类)
开启扫描后搜索到的wifi热点的信息,包括SSID,Capbilities,frequency,level等等
具体介绍参考:http://developer.android.com/reference/android/net/wifi/ScanResult.html
WifiConfiguration
描述wifi的连接信息,包括SSID,SSID隐藏,password等等设置。
具体介绍参考:https://developer.android.com/reference/android/net/wifi/WifiConfiguration.html
二:android工程(报名也要修改成unity工程包名字)
1:PTWifiConnect
package com.yxh.wifi;
import java.util.List;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
public class PTWifiConnect {
WifiManager wifiManager;
//wifi连接类型
public enum WifiCipherType{
WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID
}
public PTWifiConnect(WifiManager wifiManager){
this.wifiManager = wifiManager;
}
private boolean openWifi() {
boolean bRet = true;
if (!wifiManager.isWifiEnabled()) {
bRet = wifiManager.setWifiEnabled(true);
}
return bRet;
}
public boolean connect(String SSID, String Password, WifiCipherType Type) {
if (!this.openWifi()) {
return false;
}
while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {
try {
Thread.currentThread();
Thread.sleep(100);
} catch (InterruptedException ie) {
}
}
WifiConfiguration wifiConfig = this
.createWifiI