/* * Created by LuaView. * Copyright (c) 2017, Alibaba Group. All rights reserved. * * This source code is licensed under the MIT. * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree. */ package com.taobao.luaview.util; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.telephony.TelephonyManager; import com.taobao.luaview.receiver.ConnectionStateChangeBroadcastReceiver; /** * Network Util * * @author song */ public class NetworkUtil { private static final String TAG = "NetworkUtil"; //ConnectionChangeListener private static ConnectionStateChangeBroadcastReceiver sConnectionBroadcastReceiver; /** * 网络类型 * GPRS 2G(2.5) General Packet Radia Service 114kbps * EDGE 2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps * CDMA 2G 电信 Code Division Multiple Access 码分多址 * IDEN 2G Integrated Dispatch Enhanced Networks 集成数字增强型网络 (属于2G,来自维基百科) * 1xRTT 2G CDMA2000 1xRTT (RTT - 无线电传输技术) 144kbps 2G的过渡, * UMTS 3G WCDMA 联通3G Universal Mobile Telecommunication System 完整的3G移动通信技术标准 * EVDO_0 3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution - Data Only (Data Optimized) 153.6kps - 2.4mbps 属于3G * EVDO_A 3G 1.8mbps - 3.1mbps 属于3G过渡,3.5G * HSPA 3G (分HSDPA,HSUPA) High Speed Packet Access * EVDO_B 3G EV-DO Rev.B 14.7Mbps 下行 3.5G * EHRPD 3G CDMA2000向LTE 4G的中间产物 Evolved High Rate Packet Data HRPD的升级 * HSPAP 3G HSPAP 比 HSDPA 快些 * HSUPA 3.5G High Speed Uplink Packet Access 高速上行链路分组接入 1.4 - 5.8 mbps * HSDPA 3.5G 高速下行分组接入 3.5G WCDMA High Speed Downlink Packet Access 14.4mbps * LTE 4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G过渡,升级版 LTE Advanced 才是4G */ public enum NetworkType { NETWORK_NONE("none"), NETWORK_2G("2g"), NETWORK_3G("3g"), NETWORK_4G("4g"), NETWORK_WIFI("wifi"), NETWORK_UNKNOWN("unknown"); String type; NetworkType(String type) { this.type = type; } public String getType() { return type; } } /** * 注册ConnectionChangeListener * * @param context */ public static synchronized void registerConnectionChangeListener(Context context, ConnectionStateChangeBroadcastReceiver.OnConnectionChangeListener listener) { if (context != null) { if (sConnectionBroadcastReceiver == null) { sConnectionBroadcastReceiver = new ConnectionStateChangeBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SHUTDOWN); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); try { context.getApplicationContext().registerReceiver(sConnectionBroadcastReceiver, filter); } catch (Exception e) { e.printStackTrace(); } } sConnectionBroadcastReceiver.addOnConnectionChangeListener(listener); } } /** * 反注册ConnectionChangeListener * * @param context */ public static synchronized void unregisterConnectionChangeListener(Context context, ConnectionStateChangeBroadcastReceiver.OnConnectionChangeListener listener) { if (context != null && sConnectionBroadcastReceiver != null) { try { sConnectionBroadcastReceiver.removeOnConnectionChangeListener(listener); if (sConnectionBroadcastReceiver.getListenerSize() == 0) { context.getApplicationContext().unregisterReceiver(sConnectionBroadcastReceiver); sConnectionBroadcastReceiver = null; } } catch (Exception e) {//保护 e.printStackTrace(); } } } /** * 得到当前网络类型字符串 * * @return */ public static synchronized String getCurrentTypeStr(Context context) { final NetworkType type = getCurrentType(context); return type.getType(); } /** * 得到当前网络类型 * * @return */ public static NetworkType getCurrentType(Context context) { if (!isNetWorkAvailable(context)) { return NetworkType.NETWORK_NONE; } if (isWifi(context)) { return NetworkType.NETWORK_WIFI; } TelephonyManager tm = null; try { tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); } catch (Exception e) { LogUtil.e(TAG, e); } if (tm == null) { return NetworkType.NETWORK_NONE; } int type = tm.getNetworkType(); switch (type) { 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 NetworkType.NETWORK_2G; 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 NetworkType.NETWORK_3G; case TelephonyManager.NETWORK_TYPE_LTE: return NetworkType.NETWORK_4G; default: return NetworkType.NETWORK_UNKNOWN; } } /** * 网络是否可用 * * @return * @date 2012-11-20下午1:55:23 */ public static boolean isNetWorkAvailable(Context context) { boolean isAvailable = false; try { ConnectivityManager cm = getConnectivityManager(context); if (cm != null) { NetworkInfo info = cm.getActiveNetworkInfo(); if (info != null) { isAvailable = info.isAvailable(); } } } catch (Exception e) { } return isAvailable; } /** * 网络是否有效,可传输数据(注意Available仅仅是打开,有网络,不一定连接成功), * * @return * @date 2014-1-13 */ public static boolean isNetworkConnected(Context context) { boolean isConnected = false; try { ConnectivityManager cm = getConnectivityManager(context); if (cm != null) { NetworkInfo info = cm.getActiveNetworkInfo(); if (info != null) { isConnected = info.isAvailable() && info.isConnected(); } } } catch (Exception e) { } return isConnected; } /** * 判断是否是wifi网络 * * @return */ public static boolean isWifi(Context context) { ConnectivityManager cm = getConnectivityManager(context); if (cm != null) { NetworkInfo ni = cm.getActiveNetworkInfo(); if (ni != null && ni.getTypeName().equals("WIFI")) { return true; } } return false; } //----------------------------private methods-------------------------- private static ConnectivityManager getConnectivityManager(Context context) { ConnectivityManager cm = null; try { cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); } catch (Exception e) { } return cm; } }