У меня такой вопрос: Как можно узнать качество интернета на телефоне?
То есть, к примеру, на самом телефоне, сверху, показывается качество связи и там же, если есть 3G интернет - рисуется значок "3G", а можно ли узнать, есть ли 3g на данный момент из приложения?
Ответ
Можно таким методом проверять скорость интернета:
public static boolean isConnectionFast(int type, int subType){
if(type==ConnectivityManager.TYPE_WIFI){
System.out.println("CONNECTED VIA 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
// NOT AVAILABLE YET IN API LEVEL 7
case Connectivity.NETWORK_TYPE_EHRPD:
return true; // ~ 1-2 Mbps
case Connectivity.NETWORK_TYPE_EVDO_B:
return true; // ~ 5 Mbps
case Connectivity.NETWORK_TYPE_HSPAP:
return true; // ~ 10-20 Mbps
case Connectivity.NETWORK_TYPE_IDEN:
return false; // ~25 kbps
case Connectivity.NETWORK_TYPE_LTE:
return true; // ~ 10+ Mbps
// Unknown
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
return false;
default:
return false;
}
}else{
return false;
}
}
Здесь на вход принимаются параметры int type - значение, возвращаемое методом getType() класса NetworkInfo, и int subType - значение, возвращаемое методом getSubtype() того же класса. Однако следует учесть, что метод getType() объявлен устаревшим в API level 28, и вместо него следует использовать метод NetworkCapabilities.hasTransport(int), принимающий на вход одну из констант TRANSPORT_CELLULAR, TRANSPORT_WIFI, TRANSPORT_BLUETOOTH, TRANSPORT_ETHERNET, TRANSPORT_VPN, TRANSPORT_WIFI_AWARE или TRANSPORT_LOWPAN
C учётом этого обращение к методу isConnectionFast можно сделать примерно таким:
public static boolean isConnectedFast(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Network[] networks = cm.getAllNetworks();
NetworkInfo networkInfo;
for (Network mNetwork : networks) {
networkInfo = cm.getNetworkInfo(mNetwork);
if (networkInfo.getState().equals(NetworkInfo.State.CONNECTED)) {
NetworkCapabilities networkCapabilities = cm.getNetworkCapabilities(mNetwork);
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
isConnectionFast(NetworkCapabilities.TRANSPORT_WIFI, networkInfo.getSubtype());
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
isConnectionFast(NetworkCapabilities.TRANSPORT_CELLULAR, networkInfo.getSubtype());
}
return true;
}
}
} else {
if (cm != null) {
//noinspection deprecation
NetworkInfo[] info = cm.getAllNetworkInfo();
if (info != null) {
for (NetworkInfo networkInfo : info) {
if (networkInfo.getState() == NetworkInfo.State.CONNECTED) {
return (networkInfo != null && networkInfo.isConnected() && isConnectionFast(networkInfo.getType(), networkInfo.getSubtype()));
}
}
}
}
}
return false;
}
Комментариев нет:
Отправить комментарий