android自动连接指定wifi
2014-02-25 14:39
741 查看
publicclassWifiAutoConnectManager{
privatestaticfinalStringTAG=WifiAutoConnectManager.class.getSimpleName();
WifiManagerwifiManager;
//定义几种加密方式,一种是WEP,一种是WPA,还有没有密码的情况
publicenumWifiCipherType{
WIFICIPHER_WEP,WIFICIPHER_WPA,WIFICIPHER_NOPASS,WIFICIPHER_INVALID
}
//构造函数
publicWifiAutoConnectManager(WifiManagerwifiManager){
this.wifiManager=wifiManager;
}
//提供一个外部接口,传入要连接的无线网
publicvoidconnect(Stringssid,Stringpassword,WifiCipherTypetype){
Threadthread=newThread(newConnectRunnable(ssid,password,type));
thread.start();
}
//查看以前是否也配置过这个网络
privateWifiConfigurationisExsits(StringSSID){
List<WifiConfiguration>existingConfigs=wifiManager.getConfiguredNetworks();
for(WifiConfigurationexistingConfig:existingConfigs){
if(existingConfig.SSID.equals("\""+SSID+"\"")){
returnexistingConfig;
}
}
returnnull;
}
privateWifiConfigurationcreateWifiInfo(StringSSID,StringPassword,WifiCipherTypeType){
WifiConfigurationconfig=newWifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
config.SSID="\""+SSID+"\"";
//nopass
if(Type==WifiCipherType.WIFICIPHER_NOPASS){
config.wepKeys[0]="";
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex=0;
}
//wep
if(Type==WifiCipherType.WIFICIPHER_WEP){
if(!TextUtils.isEmpty(Password)){
if(isHexWepKey(Password)){
config.wepKeys[0]=Password;
}else{
config.wepKeys[0]="\""+Password+"\"";
}
}
config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED);
config.allowedKeyManagement.set(KeyMgmt.NONE);
config.wepTxKeyIndex=0;
}
//wpa
if(Type==WifiCipherType.WIFICIPHER_WPA){
config.preSharedKey="\""+Password+"\"";
config.hiddenSSID=true;
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.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.status=WifiConfiguration.Status.ENABLED;
}
returnconfig;
}
//打开wifi功能
privatebooleanopenWifi(){
booleanbRet=true;
if(!wifiManager.isWifiEnabled()){
bRet=wifiManager.setWifiEnabled(true);
}
returnbRet;
}
classConnectRunnableimplementsRunnable{
privateStringssid;
privateStringpassword;
privateWifiCipherTypetype;
publicConnectRunnable(Stringssid,Stringpassword,WifiCipherTypetype){
this.ssid=ssid;
this.password=password;
this.type=type;
}
@Override
publicvoidrun(){
//打开wifi
openWifi();
//开启wifi功能需要一段时间(我在手机上测试一般需要1-3秒左右),所以要等到wifi
//状态变成WIFI_STATE_ENABLED的时候才能执行下面的语句
while(wifiManager.getWifiState()==WifiManager.WIFI_STATE_ENABLING){
try{
//为了避免程序一直while循环,让它睡个100毫秒检测……
Thread.sleep(100);
}catch(InterruptedExceptionie){
}
}
WifiConfigurationwifiConfig=createWifiInfo(ssid,password,type);
//
if(wifiConfig==null){
Log.d(TAG,"wifiConfigisnull!");
return;
}
WifiConfigurationtempConfig=isExsits(ssid);
if(tempConfig!=null){
wifiManager.removeNetwork(tempConfig.networkId);
}
intnetID=wifiManager.addNetwork(wifiConfig);
booleanenabled=wifiManager.enableNetwork(netID,true);
Log.d(TAG,"enableNetworkstatusenable="+enabled);
booleanconnected=wifiManager.reconnect();
Log.d(TAG,"enableNetworkconnected="+connected);
}
}
privatestaticbooleanisHexWepKey(StringwepKey){
finalintlen=wepKey.length();
//WEP-40,WEP-104,andsomevendorsusing256-bitWEP(WEP-232?)
if(len!=10&&len!=26&&len!=58){
returnfalse;
}
returnisHex(wepKey);
}
privatestaticbooleanisHex(Stringkey){
for(inti=key.length()-1;i>=0;i--){
finalcharc=key.charAt(i);
if(!(c>='0'&&c<='9'||c>='A'&&c<='F'||c>='a'&&c<='f')){
returnfalse;
}
}
returntrue;
}
}
相关文章推荐
- android中的国际化
- android中Invalidate和postInvalidate的区别
- Android adb命令总结
- Android彩信发送
- 关于源码编译apk
- Android开发教程 强制横竖屏代码
- Android Support v4,v7,v13之间的区别
- android发送短信代码(短信内容超长处理)
- Android 关机解析
- Android图片,PNG还是JPG?用哪种?
- Android Broadcast Intents and Broadcast Receivers
- android中的原始资源的使用
- fragment
- android中的属性资源
- Android中处理耗时操作的方法有哪些?
- activity
- ViewPager+Fragment的结合使用,实现QQ界面的理解
- Android学习整理之Activity生命周期篇
- ubuntu系统安装安卓模拟器(Android SDK)的方法
- android中的样式和主题