最近上班,写了一个很长很长的WIFI模块设置模块,就像是所有系统都自带的WIFI设置模块一样(难道又做无用功?)。。。
关于参考:参考了很多的大神的WIFI编程,但是基本都是转发的别人的(转了又转。。。转了又转),所以我就不注明哪里看的了,应为我也不知道谁是原创。
之所以别人都有,为什么还做这篇笔记呢。。。关键是大神们都是挑自己认为是重点的写。。。所以。。。找的我好辛苦啊。。。
切入主题,WiFi设置模块,首先我们打开以后,当然会搜索到附近的热点了。。。如何得到呢?
首先我们要先获取wifiManager对象。。。获取方式如下
WifiManager wifiManager =(WifiManager)SetWifi.this.getSystemService(Context.WIFI_SERVICE);
然后就能获取WIFI热点的对象的链表了。。。
List<ScanResult> list = wifiManager.getScanResults();
很简单吧。。。。最后
scanResult.SSID;//这个是热点的SSID
scanResult.level;//这个是热点的信号强度
最后你用你想要的方式把这些WIFI热点表现出来就好了。。。
接下来该链接这些热点了
public WifiConfiguration CreateWifiInfo(String SSID, String Password,
int Type) {
WifiConfiguration config = new WifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
config.allowedGroupCiphers.clear();
config.allowedPairwiseCiphers.clear();
config.SSID = "\"" + SSID + "\"";
if (Type == WIFICIPHER_NOPASS) {
config.wepKeys[0] = "";
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
}
if (Type == WIFICIPHER_WEP) {
config.hiddenSSID = true;
config.wepKeys[0] = "\"" + Password + "\"";
config.allowedAuthAlgorithms
.set(WifiConfiguration.AuthAlgorithm.SHARED);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
config.allowedGroupCiphers
.set(WifiConfiguration.GroupCipher.WEP104);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
}
if (Type == WIFICIPHER_WPA) {
Log.v("my_tag", "开始配置WPA热点");
config.preSharedKey = "\"" + Password + "\"";
config.hiddenSSID = true;
config.status = WifiConfiguration.Status.ENABLED;
config.allowedAuthAlgorithms
.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.CCMP);
config.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
}
return config;
}
这是一个初始化WifiConfiguration的接口,你把SSID,密码,还有该热点的加密类型传进来就OK了,这里抱歉下 只有WPA加密方式和没有密码的通过了验证。。。(我参考的都是只有无密码验证过哦,WEP我附近没有这样的热点。。。还有TYPE的宏是自己定义的哦)
接下来就连接这个WIFI热点
wifiManager.addNetwork(wifiConfiguration);
记得连接到WIFI热点以后要上WIFI锁,什么是WIFI锁自己度娘吧
/**创建一个WIFILOCK*/
public void createWifiLock (){
mywifiLock = myWifiManager.createWifiLock("bohua");
}
/**锁定一个WIFILOCK*/
public void acquireWifiLock (){
mywifiLock.acquire();
}
/**解锁一个wifilock,这个要在断开连接时调用*/
public void releaseWifiLock()
{
if(mywifiLock != null){
if(mywifiLock.isHeld()){
mywifiLock.acquire();
}}
}
那我们该怎么断开连接呢?
public int getNetworkId(){
return (myWifiInfo == null ) ? 0 : myWifiInfo.getNetworkId();
}
int id = getNetworkId();
wifiManager.disableNetwork(id);
wifiManager.disconnect();
...这样,我们就能看到周围的热点,连接它,然后再断开它。
然后我们就再想想WIFI设置还有什么其他的功能?
首先人家能打开和关闭WIFI模块。
/*用于打开WIFI*/
public void openWifi(){
if(!wifiManager.isWifiEnabled() &&
wifiManager.getWifiState() != WifiManager.WIFI_STATE_ENABLING)
{
wifiManager.setWifiEnabled(true);
}
}
/*关闭WIFI*/
public void closeWifi(){
if(wifiManager.isWifiEnabled() &&
wifiManager.getWifiState() != WifiManager.WIFI_STATE_DISABLING)
{
<span style="white-space:pre"> </span>//如果加了WIFI锁记得解锁哦
wifiManager.setWifiEnabled(false);
}
}
这个我们实现的方法是把热点信息储存到SharedPreferences?文件?数据库?,然后。。。检测?。。。连接?
最后人家能有各种连接的信息。。。。
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int id = wifiInfo.getNetworkId();
String BSSID = wifiInfo.getBSSID();
boolean ifSSIDHidden = wifiInfo.getHiddenSSID();//判断SSID是否被隐藏
int ipaddress = wifiInfo.getIpAddress();
int linkspeed = wifiInfo.getLinkSpeed();
String macaddr = wifiInfo.getMacAddress();
int rssi = wifiInfo.getRssi();
String ssidhehe = wifiInfo.getSSID();
这样就获得了这些连接的数据,至于这些数据怎么用。。。别人有写。。。不多赘述。。。
但是这样写出了代码真的好用吗。。。其实就不能用。。。在写这些代码的时候有些需要注意的地方。。。再这先写出来。。。因为我是新手所以有什么更犀利的做法请大神指出。。。。
android.net.NetworkInfo.State state;//表示当前WIFI网络的连接状态
state = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
while(state != android.net.NetworkInfo.State.CONNECTED){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
上面是连接到WIFI热点的“润滑剂”,如果连接到WIFI之后要执行网络的操作的话,这个是必须要等待的
while (wifiManager.getWifiState() != WifiManager.WIFI_STATE_ENABLED)
;
try {
Thread.sleep(1000);
} catch (InterruptedException e2) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
上面则是对WIFI模块的检测。。。。他有5个状态 。。 不一一赘述了。。。
加上上面这些就可以用了。。。。但是如何写的好久请大神指点了