Unter Android 10 trennt Android automatisch die Verbindung zum WLAN ohne InternetAndroid

Forum für diejenigen, die für Android programmieren
Anonymous
 Unter Android 10 trennt Android automatisch die Verbindung zum WLAN ohne Internet

Post by Anonymous »

Ich arbeite an einer Android-Anwendung, in der ich programmgesteuert eine Verbindung zu einem WLAN-Gerät herstellen muss, das über kein Internet verfügt. Hier ist ein Code:

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
}
}
Verwendete Berechtigungen:

Code: Select all

    






Der obige Code funktioniert gut für Netzwerke, die eine Internetverbindung bieten.
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 configuration
Derselbe Fehler tritt nicht auf, wenn die App versucht, eine Verbindung zu einem Gerät herzustellen, das über eine Internetverbindung verfügt, selbst wenn dieses Netzwerk von einer anderen App hinzugefügt wurde.

Die 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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post