четверг, 25 декабря 2014 г.

Определение типа network-подключения

Создаем ресивер, для отслеживания изменения подключения. Инициализируем ресивер в манифесте:
<receiver
            android:name=".NetworkReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

Ресивер будет реагировать на подключение к интернету и отключение от него. Но не будет возможности отслеживать изменение типа подключения, например с 3g на 2g.
Но если у нас 3g сменилось 2g, и мы отключим передачу данных, а затем снова запустим, отобразится 2g. 
Так же данную проверку можно использовать для выбора метода обращения к серверу - тяжелого или легковесного.

public class NetworkReceiver extends BroadcastReceiver {

    String str2G = "2G";
    String str3G = "3G";
    String str4G = "4G";
    String strWiFi = "WiFi";
    String strMobile = "Mobile";

    public NetworkReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        if (getNetworkConnectionType(context).equals(strWiFi))
            Toast.makeText(context, strWiFi, Toast.LENGTH_SHORT).show();
        else if (getNetworkConnectionType(context).equals(strMobile))
            Toast.makeText(context, getNetworkClass(context), Toast.LENGTH_SHORT).show();
        else
            Toast.makeText(context, "No connection", Toast.LENGTH_SHORT).show();
    }

    public String getNetworkClass(Context context) {
        TelephonyManager mTelephonyManager = (TelephonyManager)
                context.getSystemService(Context.TELEPHONY_SERVICE);
        int networkType = mTelephonyManager.getNetworkType();
        switch (networkType) {
            case TelephonyManager.NETWORK_TYPE_GPRS:
            case TelephonyManager.NETWORK_TYPE_EDGE:
            case TelephonyManager.NETWORK_TYPE_CDMA:
            case TelephonyManager.NETWORK_TYPE_1xRTT:
            case TelephonyManager.NETWORK_TYPE_IDEN:
                return str2G;
            case TelephonyManager.NETWORK_TYPE_UMTS:
            case TelephonyManager.NETWORK_TYPE_EVDO_0:
            case TelephonyManager.NETWORK_TYPE_EVDO_A:
            case TelephonyManager.NETWORK_TYPE_HSDPA:
            case TelephonyManager.NETWORK_TYPE_HSUPA:
            case TelephonyManager.NETWORK_TYPE_HSPA:
            case TelephonyManager.NETWORK_TYPE_EVDO_B:
            case TelephonyManager.NETWORK_TYPE_EHRPD:
            case TelephonyManager.NETWORK_TYPE_HSPAP:
                return str3G;
            case TelephonyManager.NETWORK_TYPE_LTE:
                return str4G;
            default:
                return "Unknown";
        }
    }

    private String getNetworkConnectionType(Context context) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);


        boolean isMobile = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
                .isConnectedOrConnecting();
        boolean isWifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
                .isConnectedOrConnecting();

        if (isMobile)
            return strMobile;
        else if (isWifi)
            return strWiFi;
        else
            return "No connection";

    }
}

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

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