WIFI所需权限及配置
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
开启WIFI
mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
mWifiManager.setWifiEnabled(true);
扫描周围WIFI
List<ScanResult> mScanResultList = mWifiManager.getScanResults();
连接WIFI
核心连接WiFi代码(可以换不同的密码尝试)
String usePassword = "password"
int netId = mWifiManager.addNetwork(createWifiConfig(scanResult.SSID, usePassword, WIFICIPHER_WPA))
boolean enable = mWifiManager.enableNetwork(netId, true)
//ssid为wifi名,password为wifi密码,type为wifi连接使用的加密算法(一般为WPA)
private WifiConfiguration createWifiConfig(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.SSID = "\"" + ssid + "\""
WifiConfiguration tempConfig = isExist(ssid)
if (tempConfig != null) {
mWifiManager.removeNetwork(tempConfig.networkId)
}
if (type == WIFICIPHER_NOPASS) {
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE)
} else if (type == WIFICIPHER_WEP) {
config.hiddenSSID = true
config.wepKeys[0] = "\"" + password + "\""
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN)
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED)
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE)
config.wepTxKeyIndex = 0
} else if (type == 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.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP)
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP)
config.status = WifiConfiguration.Status.ENABLED
}
return config
}
wifi状态描述类 SupplicantState
ASSOCIATED
关联完成。
ASSOCIATING
开始关联到一个BSS或SSID。
COMPLETED
所有用户认证已完成。
DISCONNECTED
当前接入点不可关联,有可能开始下一个关联。
DORMANT
Android特有,当用户明确发出中断指令。
FOUR_WAY_HANDSHAKE
WPA 4次握手完成。
GROUP_HANDSHAKE
WPA group 握手完成。
INACTIVE
处于非活动状态(wpa_supplicant被禁用)。
INVALID
伪状态,通常不应被看到。
SCANNING
正在扫描网络。
UNINITIALIZED
还未连接到wpa_supplicant
wifi连接时如何知晓它连接的状态(如这个wifi密码错误)
//这个广播在我手机并不能及时反应这个wifi为不能连接状态(手机可能屏蔽部分状态)
//这个判断标准对于我的手机并不准
private void registerBroadcastReceiver() {
mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
int message = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1)
switch (message) {
case WifiManager.WIFI_STATE_DISABLED:
//Toast.makeText(getApplicationContext(), "不可用", Toast.LENGTH_SHORT).show()
break
case WifiManager.WIFI_STATE_DISABLING:
//Toast.makeText(getApplicationContext(), "正在关闭或者断开", Toast.LENGTH_SHORT).show()
break
case WifiManager.WIFI_STATE_ENABLED:
//Toast.makeText(getApplicationContext(), "可用", Toast.LENGTH_SHORT).show()
break
case WifiManager.WIFI_STATE_ENABLING:
//Toast.makeText(getApplicationContext(), "正在打开或者连接", Toast.LENGTH_SHORT).show()
break
case WifiManager.WIFI_STATE_UNKNOWN:
//Toast.makeText(getApplicationContext(), "未知", Toast.LENGTH_SHORT).show()
break
default:
break
}
} else if (intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
// WifiInfo wifiInfo = mWifiManager.getWifiInfo()
WifiInfo wifiInfo = mWifiManager.getConnectionInfo()
SupplicantState state = wifiInfo.getSupplicantState()
String str = ""
if (state == SupplicantState.SCANNING) {
str = "正在扫描"
}
if (state == SupplicantState.ASSOCIATED) {
str = "关联AP成功"
} else if (state.toString().equals("AUTHENTICATING")) {
str = "正在验证"
} else if (state == SupplicantState.ASSOCIATING) {
str = "正在关联AP..."
} else if (state == SupplicantState.COMPLETED) {
str = "连接成功"
} else if (state == SupplicantState.INACTIVE) {
} else if (state.toString().equals("DISCONNECTED")) {//连接失败
str = "连接不成功"
Log.e(TAG, "mConnectCount: " + mConnectCount)
if (mConnectCount < 1)
mConnectCount++
else {
is_password_error = true
mConnectCount = 0
// Toast.makeText(getApplicationContext(), "密码错误", Toast.LENGTH_SHORT).show()
}
}
//Toast.makeText(getApplicationContext(),str, Toast.LENGTH_SHORT).show()
Log.e(TAG, "连接状态: "+str )
}
int linkWifiResult = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 123)
Log.e(TAG, "wifi_link_error" + linkWifiResult)
if (linkWifiResult == WifiManager.ERROR_AUTHENTICATING) {
is_password_error = true
}
}
}
IntentFilter intentFilter = new IntentFilter()
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION)
intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)
registerReceiver(mBroadcastReceiver, intentFilter)
}