Страницы

Поиск по вопросам

пятница, 19 октября 2018 г.

Как узнать качество интернета на android?

У меня такой вопрос: Как можно узнать качество интернета на телефоне?
То есть, к примеру, на самом телефоне, сверху, показывается качество связи и там же, если есть 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; }

Комментариев нет:

Отправить комментарий