Что касается октября 2018 года, принятый ответ устарел.
getType()
, и сами типы теперь устарели на уровне API 28. Из Javadoc:
Вызывающие должны переключиться на проверку NetworkCapabilities # hasTransport вместо одной из констант NetworkCapabilities # TRANSPORT *.
Чтобы использовать NetworkCapabilities
, вам необходимо передать Network
экземпляр getNetworkCapabilities()
методу. Чтобы получить этот экземпляр, вам нужно вызвать, getActiveNetwork()
который был добавлен в API Level 23.
Итак, я считаю, что на данный момент правильный способ безопасно проверить, подключены ли вы к Wi-Fi или сотовой сети:
public static boolean isNetworkConnected() {
final ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm != null) {
if (Build.VERSION.SDK_INT < 23) {
final NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null) {
return (ni.isConnected() && (ni.getType() == ConnectivityManager.TYPE_WIFI || ni.getType() == ConnectivityManager.TYPE_MOBILE));
}
} else {
final Network n = cm.getActiveNetwork();
if (n != null) {
final NetworkCapabilities nc = cm.getNetworkCapabilities(n);
return (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
}
}
}
return false;
}
Вы также можете проверить наличие других типов TRANSPORT
, которые вы можете найти здесь .
Важное примечание: если вы подключены к Wi-Fi и к VPN, ваше текущее состояние может быть TRANSPORT_VPN
таким, поэтому вы можете также проверить его.
Не забудьте добавить следующее разрешение к вашему файлу AndroidManifest:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />