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

Android: How to determine Network speed in android programmatically

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

不能直接查看

但是,您可以对服务器执行 ping 操作,看看响应是否花费很长时间或根本不返回。

您也可以进行速度测试。在大多数应用程序中,这没有多大意义,因为它占用了用户的数据。

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

至少需要 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 边缘 ~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

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

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

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

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

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

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;
}

更多详情请参考这里link

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

希望对您有所帮助!

谢谢。

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

使用 NetworkInfo class、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();

更新 - 已弃用的库 - 不再维护

原post:

您可以通过 Facebook 使用 Network Connection Class

它的 ConnectionClassStateChangeListener 有一个名为 onBandwidthStateChange 的方法,该方法 returns ConnectionQuality class:

的一个实例
public interface ConnectionClassStateChangeListener {
  public void onBandwidthStateChange(ConnectionQuality bandwidthState);
}

ConnectionQuality class 是一个枚举 class 定义如下:

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
}

获取网络速度和网络类型

class NetworkUtils {

  companion object {

    // returns 102 Mbps
    fun getNetworkSpeed(context: Context): String {
        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val nc = cm.getNetworkCapabilities(cm.activeNetwork)
            val downSpeed = (nc?.linkDownstreamBandwidthKbps)?.div(1000)
            "${downSpeed ?: 0} Mbps"
        } else {
            "-"
        }
    }

    // returns 2G,3G,4G,WIFI
    fun getNetworkClass(context: Context): String {
        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val info = cm.activeNetworkInfo
        if (info == null || !info.isConnected) return "-" // not connected
        if (info.type == ConnectivityManager.TYPE_WIFI) return "WIFI"
        if (info.type == ConnectivityManager.TYPE_MOBILE) {
            return when (info.subtype) {
                TelephonyManager.NETWORK_TYPE_GPRS, TelephonyManager.NETWORK_TYPE_EDGE, TelephonyManager.NETWORK_TYPE_CDMA, TelephonyManager.NETWORK_TYPE_1xRTT, TelephonyManager.NETWORK_TYPE_IDEN, TelephonyManager.NETWORK_TYPE_GSM -> "2G"
                TelephonyManager.NETWORK_TYPE_UMTS, TelephonyManager.NETWORK_TYPE_EVDO_0, TelephonyManager.NETWORK_TYPE_EVDO_A, TelephonyManager.NETWORK_TYPE_HSDPA, TelephonyManager.NETWORK_TYPE_HSUPA, TelephonyManager.NETWORK_TYPE_HSPA, TelephonyManager.NETWORK_TYPE_EVDO_B, TelephonyManager.NETWORK_TYPE_EHRPD, TelephonyManager.NETWORK_TYPE_HSPAP, TelephonyManager.NETWORK_TYPE_TD_SCDMA -> "3G"
                TelephonyManager.NETWORK_TYPE_LTE, TelephonyManager.NETWORK_TYPE_IWLAN, 19 -> "4G"
                else -> "?"
            }
        }
        return "?"
    }

  }
}