Как узнать, подключен ли Wi-Fi на Android?

Да, вы можете использовать XOR для проверки логических значений на (не) равенство, хотя код менее интуитивно понятен: if (x ^ y) против if (x != y).

234
задан Peter Mortensen 24 September 2016 в 22:59
поделиться

1 ответ

Следующий код (в Kotlin) работает от API 21 до, по крайней мере, текущая версия API (API 29). Функция getWifiState () возвращает одно из 3 возможных значений для состояния сети WiFi: Отключите, EnabledNotConnected и Соединенный, которые были определены в классе Enum. Это позволяет принимать больше детализированных решений как информирование пользователя, чтобы включить WiFi или, если уже включено, соединиться с одной из доступных сетей. Но если все, что необходимо, будет булевской переменной, указывающей, подключен ли интерфейс WiFi к сети, то другая функция isWifiConnected () даст Вам это. Это использует предыдущий и сравнивает результат со Связанным.

Это вселено в некоторые предыдущие ответы, но пытающийся решить проблемы, представленные эволюцией Android API или медленно увеличивающаяся доступность IP V6. Прием должен был использовать:

wifiManager.connectionInfo.bssid != null 

вместо:

  1. getIpAddress () == 0, который только допустим для IP V4 или
  2. getNetworkId () ==-1, который теперь требует другого специального разрешения (Местоположение)

Согласно документации: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid это возвратит пустой указатель если не подключенный к сети. И даже если у нас не будет разрешения получить действительное значение, то оно все еще возвратит что-то другое, чем пустой указатель, если мы будем соединены.

Также имеют следующее в виду:

На выпусках прежде android.os. Сборка. VERSION_CODES#N, этот объект должен только быть получен из Context#getApplicationContext (), а не из любого другого полученного контекста для предотвращения утечек памяти в рамках обработки вызовов.

В Декларации, не забывайте добавлять:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

Предложенный код:

class MyViewModel(application: Application) : AndroidViewModel(application) {

   // Get application context
    private val myAppContext: Context = getApplication<Application>().applicationContext

   // Define the different possible states for the WiFi Connection
    internal enum class WifiState {
        Disabled,               // WiFi is not enabled
        EnabledNotConnected,    // WiFi is enabled but we are not connected to any WiFi network
        Connected,              // Connected to a WiFi network
    }

    // Get the current state of the WiFi network
    private fun getWifiState() : WifiState {

        val wifiManager : WifiManager = myAppContext.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

        return if (wifiManager.isWifiEnabled) {
                    if (wifiManager.connectionInfo.bssid != null)
                        WifiState.Connected
                    else
                        WifiState.EnabledNotConnected
               } else {
                    WifiState.Disabled
               }
    }

    // Returns true if we are connected to a WiFi network
    private fun isWiFiConnected() : Boolean {
        return (getWifiState() == WifiState.Connected)
    }
}
2
ответ дан 23 November 2019 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: