Code: Select all
private void connectToWiFi(final String ssid, String password) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
final ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
request.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); // Internet not required
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
String networkSSID = getNetworkSsid();
if (networkSSID.equals(ssid)) {
connectivityManager.bindProcessToNetwork(network);
}
}
@Override
public void onUnavailable() {
super.onUnavailable();
}
@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
}
};
connectivityManager.registerNetworkCallback(request.build(), networkCallback);
WifiConfiguration config = new WifiConfiguration();
config.SSID = String.format("\"%s\"", ssid);
int netId = -1;
List apList = wifiManager.getConfiguredNetworks();
for (WifiConfiguration i : apList) {
if (i.SSID != null && i.SSID.equals("\"" + ssid + "\"")) {
netId = i.networkId;
}
}
// Add network in Saves network list if it is not available in list
if (netId == -1) {
if (TextUtils.isEmpty(password)) {
Log.d(TAG, "====== Connect to open network");
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
} else {
Log.d(TAG, "====== Connect to secure network");
config.preSharedKey = String.format("\"%s\"", password);
}
netId = wifiManager.addNetwork(config);
}
Log.d(TAG, "Connect to Network : " + netId);
wifiManager.enableNetwork(netId, true);
} else {
// For Android 10 and above
// WifiNetworkSpecifier code
}
}
Code: Select all
Aber in den meisten Fällen schlägt er für Netzwerke ohne Internetverbindung fehl.
Wenn wir versuchen, eine Verbindung zu einer WLAN-Konfiguration herzustellen, die keinen Internetzugang hat, müssen wir den Prozess unserer App an dieses Netzwerk binden oder unseren HTTP-Client so konfigurieren, dass er die Socket-Factory dieses Netzwerks verwendet, andernfalls wird das System die Verbindung zu diesem WLAN-Netzwerk trennen.
Gemäß dieser Richtlinie ist bindProcessToNetwork bereits angewendet.
Aber das System trennt sich unabhängig von der Verwendung von bindToProcess() vom Netzwerk und leitet den Datenverkehr über die Socket-Factory weiter. Es ist nicht erlaubt, mit dem WLAN verbunden zu bleiben, wenn kein Internet vorhanden ist.
Es ist wirklich überraschend, dass Android nie an Anwendungsfälle für IoT-Geräte gedacht hat, bevor es sich auf die Netzwerkverbindung beschränkt hat.
Beim Versuch, eine Verbindung zu einem WLAN-Netzwerk herzustellen, das von meiner App, der Systemeinstellungs-App oder einer anderen App hinzugefügt wurde, zeigen die Systemprotokolle Folgendes:
Code: Select all
UID xxxxx does not have permission to update configurationDie App darf also eine Verbindung zur vorherigen Konfiguration herstellen, wenn auch mit „unzureichenden Berechtigungen“, und der Datenverkehr wird vorübergehend über dieses Netzwerk geleitet. Aber nach ein paar Sekunden wird die Netzwerkverbindung getrennt und das System versucht, sich erneut mit einem anderen internetfähigen Netzwerk zu verbinden.
Getestet auf Moto G5 Plus, Android 8.1.0, aber ich glaube, dass es sich um einen Plattformfehler und nicht um ein gerätespezifisches Problem handelt. Und meistens tritt dieser Fehler ab Android 7 oder so auf, weil er vorher funktionierte.
Ich habe hier auch ein Problem gemeldet. In dieser Ausgabe wurde auch eine Beispiel-App bereitgestellt.
Gibt es für dieses Problem eine Lösung?
Gibt es eine Möglichkeit für kostenpflichtigen Support von Android?
Vielen Dank im Voraus.
Mobile version