Hallo zusammen,
ich versuche vor Aufruf von Netzwerk-Funktionen zunächt zu ermitteln, ob das Smartphone eine Netzwerkverbindung hat.
Im Manifest habe ich angegeben:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
Im Code habe ich über enstprechende Log-Ausgaben festgestellt, dass connectivityManager.activeNetwork immer null ist.
if (capabilities != null) kommt immer im else-Zweig an.
fun isOnline(context: Context): Boolean {
Log.i("Internet", "check connectivityManager")
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
if (connectivityManager != null) {
Log.i("Internet", "connectivityManager erstellt")
val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
if (capabilities != null) { // <-- hier ist capabiliteies = null
Log.i("Internet", " capabilities")
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
Log.i("Internet", "NetworkCapabilities.TRANSPORT_CELLULAR")
return true
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
Log.i("Internet", "NetworkCapabilities.TRANSPORT_WIFI")
return true
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
Log.i("Internet", "NetworkCapabilities.TRANSPORT_ETHERNET")
return true
}
}
else {
Log.i("Internet", "keine capabilities") // <-- da capabilities = null, kommt der Code immer zu dieser Log-Ausgabe
}
}
else {
Log.i("Internet", "kein connectivityManager")
}
return false
}
}
Alles anzeigen
Das Smartphone ist aber mit dem WLAN und dem Internet verbunden. Auf dem Smartphone läuft ein LineageOs Android 13. In den Systemeinstellungen wird mir eine IPV4-Adresse angezeigt - also sollte auch eine Netzwerkverbindung vorliegen .
Hat jemand einen Tipp, warum der ConnentivityManager trotzdem kein activeNetwork erkennt? Mache ich da im Code etwas falsch? Fehlt noch eine weitere permission?
Wenn ich die Abfrage übergehe und direkt die IP-Adresse auslese, bekomme ich diese auch korrekt angezeigt. Der nachfolgende Code ergibt genau die Adresse, die mir auch in den Systemeisntellungten des Smartphone angezeigt wird.
Ich könnte daher auch einfach die vorherige Abfrage der Netzwerkverbindung umgehen und gleich die IP abfragen und validieren. Aber dass kein activeNetwork gefunden wird hat je einen Grund, der bei Übergehen der Abfrage irgendwo später zu unerklärlichen Fehlern führt und dann denkt man nicht mehr dran, dass man hier mal eine Prüfung umgangen hat...
// das funktioniert:
fun getMobileIP(): String {
NetworkInterface.getNetworkInterfaces()?.toList()?.map { networkInterface ->
networkInterface.inetAddresses?.toList()?.find {
!it.isLoopbackAddress && it is Inet4Address
}?.let { return it.hostAddress }
}
return ""
}
Viele Grüße,
Siegbert