Как вы определяете тип сетевого подключения на Android?
Это через ConnectivityManager.getActiveNetworkInfo().getType()
, и ответ ограничен Wi-Fi и мобильным телефоном?
источник
Как вы определяете тип сетевого подключения на Android?
Это через ConnectivityManager.getActiveNetworkInfo().getType()
, и ответ ограничен Wi-Fi и мобильным телефоном?
Если проблема заключается в том, чтобы определить, достаточно ли быстро подключена телефонная сеть, чтобы удовлетворить ваши требования, вы должны обработать все типы сетей, возвращаемые getSubType()
.
Мне потребовался час или два, чтобы исследовать и написать этот класс, чтобы сделать именно это, и я подумал, что поделюсь им с другими, которые могут найти его полезным.
Вот Gist класса , так что вы можете раскошелиться и отредактировать его.
package com.emil.android.util;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
/**
* Check device's network connectivity and speed
* @author emil http://stackoverflow.com/users/220710/emil
*
*/
public class Connectivity {
/**
* Get the network info
* @param context
* @return
*/
public static NetworkInfo getNetworkInfo(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo();
}
/**
* Check if there is any connectivity
* @param context
* @return
*/
public static boolean isConnected(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected());
}
/**
* Check if there is any connectivity to a Wifi network
* @param context
* @return
*/
public static boolean isConnectedWifi(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);
}
/**
* Check if there is any connectivity to a mobile network
* @param context
* @return
*/
public static boolean isConnectedMobile(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE);
}
/**
* Check if there is fast connectivity
* @param context
* @return
*/
public static boolean isConnectedFast(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && Connectivity.isConnectionFast(info.getType(),info.getSubtype()));
}
/**
* Check if the connection is fast
* @param type
* @param subType
* @return
*/
public static boolean isConnectionFast(int type, int subType){
if(type==ConnectivityManager.TYPE_WIFI){
return true;
}else if(type==ConnectivityManager.TYPE_MOBILE){
switch(subType){
case TelephonyManager.NETWORK_TYPE_1xRTT:
return false; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_CDMA:
return false; // ~ 14-64 kbps
case TelephonyManager.NETWORK_TYPE_EDGE:
return false; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_0:
return true; // ~ 400-1000 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_A:
return true; // ~ 600-1400 kbps
case TelephonyManager.NETWORK_TYPE_GPRS:
return false; // ~ 100 kbps
case TelephonyManager.NETWORK_TYPE_HSDPA:
return true; // ~ 2-14 Mbps
case TelephonyManager.NETWORK_TYPE_HSPA:
return true; // ~ 700-1700 kbps
case TelephonyManager.NETWORK_TYPE_HSUPA:
return true; // ~ 1-23 Mbps
case TelephonyManager.NETWORK_TYPE_UMTS:
return true; // ~ 400-7000 kbps
/*
* Above API level 7, make sure to set android:targetSdkVersion
* to appropriate level to use these
*/
case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11
return true; // ~ 1-2 Mbps
case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9
return true; // ~ 5 Mbps
case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13
return true; // ~ 10-20 Mbps
case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8
return false; // ~25 kbps
case TelephonyManager.NETWORK_TYPE_LTE: // API level 11
return true; // ~ 10+ Mbps
// Unknown
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
default:
return false;
}
}else{
return false;
}
}
}
Также не забудьте добавить это разрешение для AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
Источники скорости сети включают википедию и http://3gstore.com/page/78_what_is_evdo_mobile_broadband.html
public static final int
. Таким образом, вам не нужно делать "взломать". Просто нацеливаясь на новейший SDK, компилятор компилирует действительные значения (целые числа), на которые они указывают (а не их экземпляры), в байт-коды.targetSdkVersion
настройку. Я редактировал пост, чтобы удалить взломать, спасибо.Чтобы получить более точную (и удобную для пользователя) информацию о типе соединения. Вы можете использовать этот код (полученный из метода @hide в TelephonyManager.java ).
Этот метод возвращает строку, описывающую текущий тип соединения.
то есть один из: "WIFI", "2G", "3G", "4G", "5G", "-" (не подключен) или "?" (неизвестно)
Примечание: этот код требует API 25+, но вы можете легко поддерживать более старые версии, используя int вместо const. (Смотрите комментарии в коде).
источник
Вы можете использовать getSubtype () для более подробной информации. Посмотрите слайд 9 здесь: http://dl.google.com/io/2009/pres/W_0300_CodingforLife-BatteryLifeThatIs.pdf
Также, пожалуйста, ознакомьтесь с ответом Эмиля для более подробного погружения в это.
источник
@ Ответ Эмиля выше блестящий.
Небольшое дополнение: в идеале мы должны использовать TelephonyManager для определения типов сетей. Таким образом, выше следует вместо этого читать:
источник
Ответ Эмиля Давтяна хороший, но добавлены типы сетей, которые не учитываются в его ответе. Таким образом,
isConnectionFast(int type, int subType)
может вернуть ложь, когда это должно быть правдой.Вот модифицированный класс, который использует отражение для учета добавленных типов сети в более поздних API:
источник
if (NetworkUtils.isWifiConnection(this) { /* do stuff */ }
Вы можете создать собственный метод для выполнения этой задачи.
источник
Вдобавок к удивительному ответу Эмиля я хотел бы добавить еще один метод для проверки, действительно ли у вас есть доступ к Интернету, поскольку вы можете отключить данные на своем телефоне.
Обратите внимание, что это только для проверки, есть ли соединение для передачи данных сотовой связи, и будет ли возвращено значение false, если у вас подключен WiFi, так как данные сотовой связи отключены, когда подключен WiFi.
источник
Вы можете проверить, как это
источник
должен получить вам имя сети
источник
В настоящее время поддерживаются только MOBILE и WIFI. Взгляните и читаемая человеком функция типа .
источник
Вы можете попробовать это:
источник
Определите, какой тип сети и получить логическое значение isconnected или не использовать ниже фрагмент
используйте это после того, как класс передаст контекст, вы получите статус сети, такой как тип сети, быстрая сеть и т.д.
источник
Ниже показаны различные способы сделать это. Обратите внимание, что в классе ConnectivityManager существует множество типов сетей. Также, если API> = 21, вы можете проверить типы сетей в классе NetworkCapabilities.
источник