Какая альтернатива ConnectivityManager.TYPE_WIFI устарела в Android P API 28?

ConnectivityManager.TYPE_WIFI устарел в Android P API 28. Кроме того, NetworkInfo#getType и ConnectivityManager.TYPE_MOBILE также устарели.

Итак, каковы альтернативы для них? Я так понял, что надо использовать метод из класса NetworkCapabilities. Однако я не могу объединить все вещи в одном месте, например, как сделать getType() в классе NetworkCapabilities и как добавить к нему проверки данных WIFI и сотовой связи?

Пожалуйста помогите.


person Amrut    schedule 15.10.2018    source источник


Ответы (4)


ConnectivityManager.TYPE_WIFI Устарело. Вы должны использовать NetworkCapabilities.

Это заменяет старый ConnectivityManager.TYPE_MOBILE метод выбора сети. Вместо того, чтобы указывать на потребность в Wi-Fi, потому что приложению требуется высокая пропускная способность и существует риск устаревания при появлении новой быстрой сети (например, LTE), приложение должно указать, что ему требуется высокая пропускная способность. Точно так же, если приложению требуется безлимитная сеть для массовой передачи, оно может указать, что вместо того, чтобы предполагать, что все соединения на основе сотовой связи являются лимитными, а все соединения на основе Wi-Fi — нет.

Вместо этого приложения должны использовать NetworkCapabilities.hasTransport(int) или requestNetwork(NetworkRequest, NetworkCallback) для запроса соответствующей сети. для поддерживаемых транспортов.

Вы можете попробовать этот способ

NetworkAgentInfo networkAgent;
int type = ConnectivityManager.TYPE_NONE;
if (networkAgent.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
     type = ConnectivityManager.TYPE_MOBILE;
} else if (networkAgent.networkCapabilities.hasTransport(
     NetworkCapabilities.TRANSPORT_WIFI)) {
     type = ConnectivityManager.TYPE_WIFI;
}
person IntelliJ Amiya    schedule 15.10.2018
comment
@МарекДж. android.googlesource.com/platform/frameworks/base/+/4f868ed/ - person IntelliJ Amiya; 12.02.2019
comment
В этом ответе отсутствует важный шаг... Как получить networkAgent? - person Niall; 14.08.2019
comment
Проверьте ссылку выше, пожалуйста - person IntelliJ Amiya; 14.08.2019
comment
Вы имеете в виду ссылку на исходный код NetworkAgentInfo? Это никому не говорит, как получить его экземпляр во время выполнения. - person Niall; 21.08.2019
comment
Что такое NetworkAgetInfo? а также вы снова используете ConnectivityManager.TYPE_WIFI, который устарел - person nnyerges; 22.10.2019

Вы можете использовать приведенный ниже фрагмент кода, чтобы проверить, есть ли у вас соединение Wi-Fi или сотовая связь:

ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
    Network network = connectivityManager.getActiveNetwork();
    NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
    return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR));
}
person Chintan Soni    schedule 15.10.2018
comment
любая альтернатива? - person Nitish; 23.09.2019
comment
Я уже пробовал приведенный выше код, затем я оптимизировал свой код, и в результате произошел сбой. Итак, я составил вопрос stackoverflow.com/q/59745326/1384360, мне нужна ваша помощь, спасибо - person Subhanshuja; 15.01.2020

Используйте метод ниже.. 19/06/2019

public boolean isconnectedToWifi(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager == null) {
        return false;
    }

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        Network network = connectivityManager.getActiveNetwork();
        NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
        if (capabilities == null) {
            return false;
        }
        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
    } else {
        NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (networkInfo == null) {
            return false;
        }
        return networkInfo.isConnected();
    }
}
person Syed Zeeshan    schedule 19.06.2019

Вот как мне удалось проверить, доступен ли WIFI, не используя устаревшие библиотеки и не добавляя поддержку устройств marshamallow.

@ExperimentalCoroutinesApi
    suspend fun isWifiAvailable(): Boolean {
        val connectivityManager =
            ContextCompat.getSystemService(context, ConnectivityManager::class.java) ?: return false
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val networkCapabilities = connectivityManager.activeNetwork ?: return false
            val activeNetwork =
                connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
            return activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
        } else {
            return connectivityManager.isNetworkAvailable(NetworkCapabilities.TRANSPORT_WIFI)
//            val activeNetwork = connectivityManager.`activeNetworkInfo`
//            return activeNetwork?.type == ConnectivityManager.TYPE_WIFI
        }
    }

    @ExperimentalCoroutinesApi
    private suspend fun ConnectivityManager.isNetworkAvailable(vararg transportType: Int): Boolean {
        return suspendCancellableCoroutine { continuation ->
            val builder = NetworkRequest.Builder()
            transportType.forEach {
                builder.addCapability(it)
            }
            val networkRequest = builder.build()
            val networkCallback = object : ConnectivityManager.NetworkCallback() {
                override fun onAvailable(network: Network) {
                    super.onAvailable(network)
                    continuation.resume(true, null)
                    unregisterNetworkCallback(this)
                }

                override fun onLost(network: Network) {
                    super.onLost(network)
                    continuation.resume(false, null)
                    unregisterNetworkCallback(this)
                }

                override fun onUnavailable() {
                    super.onUnavailable()
                    continuation.resume(false, null)
                    unregisterNetworkCallback(this)
                }
            }
            registerNetworkCallback(networkRequest, networkCallback)
        }
    }
person Priya Sindkar    schedule 09.07.2021