问题描述
我想检测手机的网络连接速度是慢还是网络速度快。
现在他们已弃用 NetworkInfo
并建议我们应该使用 ConnectivityManager#getNetworkCapabilities
使用它我能够获得信号强度但无法弄清楚如何使用 {{1} 返回的整数值}
它返回一个整数值,我得到这些值(-39、-71、-31)。 我的问题是我们应该如何定义信号强度好/差。
networkCapabilities.getSignalStrength()
解决方法
假设您认为 2G 很慢,您可以按如下方式识别 2G 网络
NetworkInfo network = connectivity.getActiveNetworkInfo();
int netSubType = network.getSubtypeName();
if(netSubType == TelephonyManager.NETWORK_TYPE_GPRS ||
netSubType == TelephonyManager.NETWORK_TYPE_EDGE ||
netSubType == TelephonyManager.NETWORK_TYPE_1xRTT) {
//user is in slow network
}
请参阅 TelephonyManager 类以获得更多此类常量值。
,首先,这是一种指导性方法,而不是直接回答问题。
int signalStrength = networkCapabilities.getSignalStrength();
文档:
这是一个有符号整数,值越高表示信号越强。确切的单位取决于承载。例如,Wi-Fi 使用 wifi 代码报告的相同 RSSI 单位。
这意味着 signalStrength
持有一个与信号承载相关的值;例如,如果承载是 WiFi,那么 signalStrength
将反映相同的 WiFi RSSI 单元。
RSSI,即“接收信号强度指示器”,衡量您的设备接收来自接入点或路由器的信号的能力。该值可用于确定您是否有足够的信号来获得良好的无线连接。
因此,您需要将这些单位映射到某个质量指标,以了解信号是否弱/强。这是通信/信号相关的,而不是编程的观点...... This thread 和 this one 也可以在 WiFi 承载的情况下帮助您。
但是您需要根据其 RSSI 单位为其他类型的信号承载同样定制此质量级别。
GSM 信号,例如您可以使用具有 CellSignalStrengthGsm
的getRssi()
CellSignalStrengthLte
用于 LTE 等。
您还可以从 android.telephony API 的 SignalStrength
类中获取信号强度级别...有一个 getLevel()
方法返回一个 0 到 4 之间的整数,表示一般信号质量。 Here 你可以找到一个倾听者。