Android 设备网络信息的获取(网络类型、网络强度、网络速度、代理情况)
16lz
2021-01-23
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); }
更多相关文章
- 【Android笔记】Android的三种网络通信方式
- HierarchyView的实现原理和Android设备无法使用HierarchyView的
- android与网络(中)socket的陷阱
- Android定位详解 兼容网络定位、GPS定位
- 使用QT调用FFMPEG库部署到Android设备、完成视频音频应用开发
- Android判断网络状态方法详解
- Android 手机制式和网络类型 GSM/EDGE/CDMA/WCDMA 判断sim卡类型
- Android实习生 —— 网络请求及数据解析