1、Android 设备网络类型的判断

判断网络类型主要还是依赖系统服务(系统为我们提供了大量的服务,以便我们能够查看到设备的一些信息),这里通过 Context.CONNECTIVITY_SERVICE 这个服务来获得 ConnectivityManager 类对象。具体实现如下

/**     * 获得网络类型     *     * @param context     * @return     */    public int getNetworkState(Context context) {    //获得 ConnectivityManager 对象        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);        if (null == cm) {        //对象为空为无网络            return NETWORK_NONE;        }        //获取当前活跃的网络数据信息,该方法需要申请系统 ACCESS_NETWORK_STATE 权限        NetworkInfo activeNetInfo = cm.getActiveNetworkInfo();        if (activeNetInfo == null || !activeNetInfo.isAvailable()) {            return NETWORK_NONE;        }        //查找 WI-FI 类型的网络信息        NetworkInfo wifiInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);        if (wifiInfo != null) {        //得到网络状态信息            NetworkInfo.State state = wifiInfo.getState();            if (null != state) {                if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) {                    return NETWORK_WIFI;                }            }        }//获取 TelephonyManager 对象        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);        //获得网络类型        int networkType = telephonyManager.getNetworkType();        switch (networkType) {            case TelephonyManager.NETWORK_TYPE_GPRS:            case TelephonyManager.NETWORK_TYPE_CDMA:            case TelephonyManager.NETWORK_TYPE_EDGE:            case TelephonyManager.NETWORK_TYPE_1xRTT:            case TelephonyManager.NETWORK_TYPE_IDEN:                return NETWORK_2G;            // 3G网络            case TelephonyManager.NETWORK_TYPE_EVDO_A:            case TelephonyManager.NETWORK_TYPE_UMTS:            case TelephonyManager.NETWORK_TYPE_EVDO_0:            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 NETWORK_3G;            // 4G网络            case TelephonyManager.NETWORK_TYPE_LTE:                return NETWORK_4G;            default:                return NETWORK_MOBILE;        }    }

2、获取 Android 设备的网络强度

/**     * 监听网络强度     *     * @param context     */    public void listenerSignal(Context context) {        if (telephonyManager == null) {        //获取一个电话管理类            telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);            if (phoneStatListener == null) {                phoneStatListener = new PhoneStatListener();            }            //通过 listen 方法来侦听电话信息的改变,这里用来侦听网络信号的强度变化,具体还能侦听什么需要看 PhoneStateListener 类的源码            telephonyManager.listen(phoneStatListener, PhoneStatListener.LISTEN_SIGNAL_STRENGTHS);        }    }private class PhoneStatListener extends PhoneStateListener {        private int mSignalStrength;        @Override        public void onSignalStrengthsChanged(SignalStrength signalStrength) {        //获取信号强度变化            super.onSignalStrengthsChanged(signalStrength);            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                mSignalStrength = signalStrength.getLevel();                return;            }            mSignalStrength = signalStrength.getGsmSignalStrength();        }    }

3、获取 Android 设备的网络速率

Android 获取网络速率主要是用到 TrafficStats 这个类。翻译下这个类的注释如下:该类提供网络流量统计。 这些统计数据包括字节发送和接收和发送的网络数据包与接收到的,在所有的接口和移动接口,以及基于每个UID基础。
这些统计数据可能并不适用于所有平台。 如果统计数据不被本机支持, UNSUPPORTED将被退回。
请注意,这个类返回复位和统计每次重新启动后从零开始。 为了获得更强大的历史网络统计数据,使用 NetworkStatsManager 代替。
详细使用如下:

public String getNetSpeed() {//获得此刻系统收到的总的流量数据        long tempSum = TrafficStats.getTotalRxBytes()                + TrafficStats.getTotalTxBytes();      //得到此刻和上次的流量差值(可以设置 1 秒钟获取一次)        long rxtxLast = tempSum - lastRxTx;        double totalSpeed = rxtxLast * 1000 / 2000d;        lastRxTx = tempSum;        netRate = showSpeed(totalSpeed);//设置显示当前网速        return netRate;    }/*** 格式化网络速率*/    private String showSpeed(double speed) {        String speedString;        if (speed >= 1048576d) {            speedString = showFloatFormat.format(speed / 1048576d) + "MB/s";        } else {            speedString = showFloatFormat.format(speed / 1024d) + "KB/s";        }        return speedString;    }

4、判断 Android 设备是否使用网络代理

/**     * 判断设备 是否使用代理上网     */    public boolean isWifiProxy(Context context) {        final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;        String proxyAddress;        int proxyPort;        if (IS_ICS_OR_LATER) {            proxyAddress = System.getProperty("http.proxyHost");            String portStr = System.getProperty("http.proxyPort");            proxyPort = Integer.parseInt((portStr != null ? portStr : "-1"));        } else {            proxyAddress = android.net.Proxy.getHost(context);            proxyPort = android.net.Proxy.getPort(context);        }        return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1);    }

更多相关文章

  1. 【Android笔记】Android的三种网络通信方式
  2. HierarchyView的实现原理和Android设备无法使用HierarchyView的
  3. android与网络(中)socket的陷阱
  4. Android定位详解 兼容网络定位、GPS定位
  5. 使用QT调用FFMPEG库部署到Android设备、完成视频音频应用开发
  6. Android判断网络状态方法详解
  7. Android 手机制式和网络类型 GSM/EDGE/CDMA/WCDMA 判断sim卡类型
  8. Android实习生 —— 网络请求及数据解析

随机推荐

  1. Android 开机图片/文字/动画的修改
  2. Android实现远程服务端与客户端的通信AID
  3. 获取 Android(安卓)设备的唯一标识码
  4. Android UIAutomator 定位方式详解
  5. Android Studio中创建Selector文件的方法
  6. Android之——自定义复合控件的实现
  7. android,不让edittext一进入页面就获取焦
  8. HwBinder原理总结-Android10.0 HwBinder
  9. Android Market有望后来居上
  10. android so库、jar包生成和使用