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

199
11 июля 2018, 21:00

У меня такой вопрос: Как можно узнать качество интернета на телефоне?

То есть, к примеру, на самом телефоне, сверху, показывается качество связи и там же, если есть 3G интернет - рисуется значок "3G", а можно ли узнать, есть ли 3g на данный момент из приложения?

Answer 1

Можно таким методом проверять скорость интернета:

 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;
}
READ ALSO
Потеря пикселей при конвертации

Потеря пикселей при конвертации

Суть задачи: Есть массив субтитров (long start, long end, string text)Мне нужно в зависимости от времени показа изменять ширину (int) для соответствующего...

213
Вернуться в начало цикла [дубликат]

Вернуться в начало цикла [дубликат]

На данный вопрос уже ответили:

222
Android studio 3.1.3 проблема с Gradle

Android studio 3.1.3 проблема с Gradle

После установки Windows 10 установил Android Studio, установил нужные пакеты, но при создании нового проекта вылетает ошибка:

280
Удаление часть текста из String (java)

Удаление часть текста из String (java)

Есть строка String N , она имеет какой то текст: Жили были баб-да деда , была у них внучка Люба, очень красивая

227