Android: How to determine Network speed in android programmatically

Min*_*rol 6 java android kotlin-android-extensions

How to show a slow internet connection to the user when the network is connected Note: Not a network type (2G,3G,4G, WIFI)

小智 17

确定您的网络速度 - (慢速网速)

使用 NetworkInfo 类、ConnectivityManager 和 TelephonyManager 来确定您的网络类型。

从 Internet 下载任何文件并计算所用时间与文件中的字节数。(确定速度检查的唯一可能方法)

我已经为我的项目尝试了下面的逻辑,你也研究过这个,希望它对你有帮助。

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    //should check null because in airplane mode it will be null
    NetworkCapabilities nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
    int downSpeed = nc.getLinkDownstreamBandwidthKbps();
    int upSpeed = nc.getLinkUpstreamBandwidthKbps();
Run Code Online (Sandbox Code Playgroud)

  • 这需要 API 级别 23 (5认同)
  • 我也有同样的价值观。我认为这行不通,因为它可能只会返回网络支持的最大带宽。就我而言,它返回 1048576,即 1Gbps,这在我连接的网络中是不可能的。其次,类名“NetworkCapability”本身表示网络的功能,因此它表示该网络的最大功能。 (4认同)
  • 这不起作用,因为他们说它返回网络的最大上传和下载速度 (3认同)
  • 这需要 API 级别 21 (2认同)
  • 不同网络中的 getLinkUpstreamBandwidthKbps 和 getLinkDownstreamBandwidthKbps 始终返回相同的值。为什么? (2认同)

Har*_*iya 7

检查移动网络的互联网速度以使用此代码

ConnectivityManager connectivityManager = (ConnectivityManager)this.getSystemService(CONNECTIVITY_SERVICE);
NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
var downSpeed = nc.getLinkDownstreamBandwidthKbps();
var upSpeed = nc.getLinkUpstreamBandwidthKbps();
Run Code Online (Sandbox Code Playgroud)

如果检查wifi 网络的互联网速度以使用此代码

public int getWifiLevel()
{
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    int linkSpeed = wifiManager.getConnectionInfo().getRssi();
    int level = WifiManager.calculateSignalLevel(linkSpeed, 5);
    return level;
}
Run Code Online (Sandbox Code Playgroud)

更多详情请参考此链接

https://android.jlelse.eu/designing-android-apps-to-handle-slow-network-speed-dedc04119aac

我希望这可以帮助你!

谢谢你。


kka*_*akk 5

至少需要 api:21。我使用ConnectivityManager结合来NetworkCapabilities获取下行和上行带宽。效果很好。您可以根据速度(以 kbps 为单位)决定速度是 2G、3G 还是 4G 级别。

ConnectivityManager cm = (ConnectivityManager)this.getSystemService(CONNECTIVITY_SERVICE);
NetworkCapabilities nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
var downSpeed = nc.getLinkDownstreamBandwidthKbps();
var upSpeed = nc.getLinkUpstreamBandwidthKbps();
Run Code Online (Sandbox Code Playgroud)
  • 2G GSM ~14.4 Kbps
  • G GPRS ~26.8 Kbps
  • E 边缘 ~108.8 Kbps
  • 3G UMTS ~128 Kbps
  • H HSPA ~3.6 Mbps
  • H+ HSPA+ ~14.4 Mbps-23.0 Mbps
  • 4G LTE ~50 Mbps
  • 4G LTE-A ~500 Mbps

下载文件是对解决方案的过度设计,因为毕竟,您不对用户的互联网连接负责 - 他们是(或者更确切地说是他们的服务提供商)!对于大多数用例来说,根据他们当前的状态向他们提供信息就足够了。这为您提供了一种在执行操作之前快速检查当前链接速度的方法。