接續 (一百九十三) Android Q 學習WiFi AP的臨時禁用
1.臨時禁用的場景
上一篇梳理到了網絡不通會導致臨時禁用
/**
* Network Selection disable reason thresholds. These numbers are used to debounce network
* failures before we disable them.
* These are indexed using the disable reason constants defined in
* {@link android.net.wifi.WifiConfiguration.NetworkSelectionStatus}.
*/
@VisibleForTesting
public static final int[] NETWORK_SELECTION_DISABLE_THRESHOLD = {
-1, // threshold for NETWORK_SELECTION_ENABLE
1, // threshold for DISABLED_BAD_LINK
5, // threshold for DISABLED_ASSOCIATION_REJECTION
5, // threshold for DISABLED_AUTHENTICATION_FAILURE
5, // threshold for DISABLED_DHCP_FAILURE
5, // threshold for DISABLED_DNS_FAILURE
1, // threshold for DISABLED_NO_INTERNET_TEMPORARY
1, // threshold for DISABLED_WPS_START
6, // threshold for DISABLED_TLS_VERSION_MISMATCH
1, // threshold for DISABLED_AUTHENTICATION_NO_CREDENTIALS
1, // threshold for DISABLED_NO_INTERNET_PERMANENT
1, // threshold for DISABLED_BY_WIFI_MANAGER
1, // threshold for DISABLED_BY_USER_SWITCH
1, // threshold for DISABLED_BY_WRONG_PASSWORD
1 // threshold for DISABLED_AUTHENTICATION_NO_SUBSCRIBED
};
else if (reason < NetworkSelectionStatus.DISABLED_TLS_VERSION_MISMATCH) {
setNetworkSelectionTemporarilyDisabled(config, reason);
}
其實是WifiConfiguration中小於DISABLED_TLS_VERSION_MISMATCH的reason disable都算臨時禁用,比如關聯拒絕或者dhcp dns失敗等,這些都是可能網絡問題導致的臨時失敗,後期可恢復的。
/**
* @deprecated it is not used any more.
* This network is disabled because higher layer (>2) network is bad
*/
public static final int DISABLED_BAD_LINK = 1;
/**
* This network is disabled because multiple association rejects
*/
public static final int DISABLED_ASSOCIATION_REJECTION = 2;
/**
* This network is disabled because multiple authentication failure
*/
public static final int DISABLED_AUTHENTICATION_FAILURE = 3;
/**
* This network is disabled because multiple DHCP failure
*/
public static final int DISABLED_DHCP_FAILURE = 4;
/**
* This network is disabled because of security network but no credentials
*/
public static final int DISABLED_DNS_FAILURE = 5;
/**
* This network is temporarily disabled because it has no Internet access.
*/
public static final int DISABLED_NO_INTERNET_TEMPORARY = 6;
/**
* This network is disabled because we started WPS
*/
public static final int DISABLED_WPS_START = 7;
/**
* This network is disabled because EAP-TLS failure
*/
public static final int DISABLED_TLS_VERSION_MISMATCH = 8;
2.臨時禁用的恢復
臨時禁用除了禁用時間到了後被WifiConnectivityManager掃描到後恢復,還有重啓也可以恢復
XmlUtil.java
public static NetworkSelectionStatus parseFromXml(XmlPullParser in, int outerTagDepth)
throws XmlPullParserException, IOException {
NetworkSelectionStatus selectionStatus = new NetworkSelectionStatus();
String statusString = "";
String disableReasonString = "";
// Loop through and parse out all the elements from the stream within this section.
while (!XmlUtil.isNextSectionEnd(in, outerTagDepth)) {
String[] valueName = new String[1];
Object value = XmlUtil.readCurrentValue(in, valueName);
if (valueName[0] == null) {
throw new XmlPullParserException("Missing value name");
}
switch (valueName[0]) {
case XML_TAG_SELECTION_STATUS:
statusString = (String) value;
break;
case XML_TAG_DISABLE_REASON:
disableReasonString = (String) value;
break;
case XML_TAG_CONNECT_CHOICE:
selectionStatus.setConnectChoice((String) value);
break;
case XML_TAG_CONNECT_CHOICE_TIMESTAMP:
selectionStatus.setConnectChoiceTimestamp((long) value);
break;
case XML_TAG_HAS_EVER_CONNECTED:
selectionStatus.setHasEverConnected((boolean) value);
break;
default:
throw new XmlPullParserException(
"Unknown value name found: " + valueName[0]);
}
}
// Now figure out the network selection status codes from |selectionStatusString| &
// |disableReasonString|.
int status =
Arrays.asList(NetworkSelectionStatus.QUALITY_NETWORK_SELECTION_STATUS)
.indexOf(statusString);
int disableReason =
Arrays.asList(NetworkSelectionStatus.QUALITY_NETWORK_SELECTION_DISABLE_REASON)
.indexOf(disableReasonString);
// If either of the above codes are invalid or if the network was temporarily disabled
// (blacklisted), restore the status as enabled. We don't want to persist blacklists
// across reboots.
if (status == -1 || disableReason == -1 ||
status == NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED) {
status = NetworkSelectionStatus.NETWORK_SELECTION_ENABLED;
disableReason = NetworkSelectionStatus.NETWORK_SELECTION_ENABLE;
}
selectionStatus.setNetworkSelectionStatus(status);
selectionStatus.setNetworkSelectionDisableReason(disableReason);
return selectionStatus;
}
可以看到在重啓後解析WiFi config文件的時候,若解析到是臨時禁用,則會恢復成enable的狀態。