Android 设备网络信息的获取(网络类型、网络强度、网络速度、代理情况)

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);

    }
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值