Android:如何以编程方式确定android中的网络速度

问题描述 投票:1回答:7

如何在连接网络时显示与用户的慢速互联网连接注意:不是网络类型(2G,3G,4G,WIFI)

java android kotlin-android-extensions
7个回答
1
投票

确定网络速度 - (慢速上网速度)

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

从互联网下载任何文件并计算文件中的字节数所花费的时间。 (唯一可能的方法来确定速度检查)

我已经为我的项目尝试了以下逻辑,你也看看这个,希望它能帮助你。

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

1
投票

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

ConnectivityManager connectivityManager = (ConnectivityManager)this.getSystemService(CONNECTIVITY_SERVICE);
NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
var downSpeed = nc.getLinkDownstreamBandwidthKbps();
var upSpeed = nc.getLinkUpstreamBandwidthKbps();

如果检查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;
}

更多细节请参考此链接

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

我希望这可以帮到你!

谢谢。


0
投票

你不能直接检查它。

但是,您可以ping服务器并查看响应是否需要很长时间或根本不会返回。

你也可以做最快的。在大多数应用程序中,这没有多大意义,因为它对用户数据的影响很大。


0
投票

你可以做的最基本的事情是探测一个正常运行时间几乎为100%的网址,比方说,www.google.com。从您开始请求到完成请求的时间,您只需测量您为请求下载的数据量。所以你有数据(空间)和花费的时间。只需按时间划分空间即可获得网络速度。这有点不精确,因为它还取决于您探测的URL。


0
投票

似乎android不直接允许这个。您可以尝试下载某些文件以确定您的互联网速度。以下是连接质量列表:

  • POOR //带宽低于150 kbps。
  • MODERATE //带宽介于150和550 kbps之间。
  • 好//带宽超过2000 kbps。
  • 优秀//带宽超过2000 kbps。
  • UNKNOWN //无法找到连接质量。

您可以查看本文https://android.jlelse.eu/designing-android-apps-to-handle-slow-network-speed-dedc04119aac中的详细信息


0
投票

你可以使用Facebook的Network Connection Class

它的ConnectionClassStateChangeListener有一个名为onBandwidthStateChange的方法,它返回一个ConnectionQuality类的实例:

public interface ConnectionClassStateChangeListener {
  public void onBandwidthStateChange(ConnectionQuality bandwidthState);
}

ConnectionQuality类是一个枚举类,定义如下:

public enum ConnectionQuality {
  /**
   * Bandwidth under 150 kbps.
   */
  POOR,
  /**
   * Bandwidth between 150 and 550 kbps.
   */
  MODERATE,
  /**
   * Bandwidth between 550 and 2000 kbps.
   */
  GOOD,
  /**
   * EXCELLENT - Bandwidth over 2000 kbps.
   */
  EXCELLENT,
  /**
   * Placeholder for unknown bandwidth. This is the initial value and will stay at this value
   * if a bandwidth cannot be accurately found.
   */
  UNKNOWN
}

-2
投票

需要最低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();
  • 2G GSM~14.4 Kbps
  • G GPRS~26.8 Kbps
  • E EDGE~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

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

© www.soinside.com 2019 - 2024. All rights reserved.