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("");
String portStr = System.getProperty("");
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);
}