package
com.example.testwifi;
import
java.util.List;
import
java.util.concurrent.TimeUnit;
import
java.util.concurrent.locks.Condition;
import
java.util.concurrent.locks.Lock;
import
java.util.concurrent.locks.ReentrantLock;
import
android.content.BroadcastReceiver;
import
android.content.Context;
import
android.content.Intent;
import
android.content.IntentFilter;
import
android.net.wifi.SupplicantState;
import
android.net.wifi.WifiConfiguration;
import
android.net.wifi.WifiInfo;
import
android.net.wifi.WifiManager;
public
class
WifiConnector {
private
static
final
int
WIFI_CONNECT_TIMEOUT =
20
;
private
Context mContext;
private
WifiManager mWifiManager;
private
Lock mLock;
private
Condition mCondition;
private
WiFiConncetReceiver mWifiConnectReceiver;
private
WifiConnectListener mWifiConnectListener;
private
boolean
mIsConnnected =
false
;
private
int
mNetworkID = -
1
;
public
enum
SecurityMode {
OPEN, WEP, WPA, WPA2
}
public
interface
WifiConnectListener {
public
void
OnWifiConnectCompleted(
boolean
isConnected );
}
public
WifiConnector( Context context , WifiConnectListener listener ) {
mContext = context;
mLock =
new
ReentrantLock();
mCondition = mLock.newCondition();
mWifiManager=(WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);
mWifiConnectReceiver =
new
WiFiConncetReceiver();
mWifiConnectListener = listener;
}
public
void
connect(
final
String ssid,
final
String password,
final
SecurityMode mode ) {
new
Thread(
new
Runnable() {
@Override
public
void
run() {
if
( !mWifiManager.isWifiEnabled() ) {
mWifiManager.setWifiEnabled(
true
);
}
mContext.registerReceiver(mWifiConnectReceiver,
new
IntentFilter(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION));
if
( !onConnect(ssid,password,mode) ) {
mWifiConnectListener.OnWifiConnectCompleted(
false
);
}
else
{
mWifiConnectListener.OnWifiConnectCompleted(
true
);
}
mContext.unregisterReceiver(mWifiConnectReceiver);
}
}).start();
}
protected
boolean
onConnect( String ssid, String password, SecurityMode mode ) {
WifiConfiguration cfg =
new
WifiConfiguration();
cfg.SSID =
"\""
+ ssid +
"\""
;
if
( password !=
null
&& !
""
.equals(password) ) {
if
( mode == SecurityMode.WEP ) {
cfg.wepKeys[
0
] =
"\""
+ password +
"\""
;
cfg.wepTxKeyIndex =
0
;
}
else
{
cfg.preSharedKey =
"\""
+ password +
"\""
;
}
}
cfg.status = WifiConfiguration.Status.ENABLED;
mNetworkID = mWifiManager.addNetwork(cfg);
mLock.lock();
mIsConnnected =
false
;
if
( !mWifiManager.enableNetwork(mNetworkID ,
true
) ) {
mLock.unlock();
return
false
;
}
try
{
mCondition.await(WIFI_CONNECT_TIMEOUT, TimeUnit.SECONDS);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
mLock.unlock();
return
mIsConnnected;
}
protected
class
WiFiConncetReceiver
extends
BroadcastReceiver {
@Override
public
void
onReceive(Context context, Intent intent) {
if
(!WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(intent.getAction())) {
return
;
}
mLock.lock();
WifiInfo info = mWifiManager.getConnectionInfo();
if
( info.getNetworkId()==mNetworkID && info.getSupplicantState() == SupplicantState.COMPLETED ) {
mIsConnnected =
true
;
mCondition.signalAll();
}
mLock.unlock();
}
}
}