Android: How to determine Network speed in android programmatically

旧巷老猫 提交于 2020-02-19 19:30:47

问题


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


回答1:


Determining your Network Speed - (Slow Internet Speed)

Using NetworkInfo class, ConnectivityManager and TelephonyManager to determine your Network Type.

Download any file from the internet & calculate how long it took vs number of bytes in the file. ( Only possible way to determine Speed Check )

I have tried the below Logic for my projects, You have also look into this, Hope it helps you.

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



回答2:


Check internet speed for mobile network to use this code

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

If check internet speed for wifi network to use this code

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

And more details refer this link

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

I hope this can help you!

Thank You.




回答3:


UPDATE - DEPRECATED LIBRARY - no longer mainteined

original post:

You can use Network Connection Class by Facebook.

Its ConnectionClassStateChangeListener has a method called onBandwidthStateChange that returns an instance of ConnectionQuality class:

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

ConnectionQuality class is an enum class defined as below:

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
}



回答4:


You can't directly check it.

However, you could either ping a server and see if the response takes very long or doesn't come back at all.

You could also do a speedtest. In most applications this would not make much sense though, because it's a hog on the user's data.




回答5:


The most basic thing you can do is to probe an URL whose uptime is almost 100% like, let's say, www.google.com. From the time you start the request, to the time it has completed, you can just measure the amount of data you have downloaded for the request. So you have the data (space) and time spent. Just divide space by time to get network speed. This is somewhat imprecise, because it also depend on the URL you probe.




回答6:


It seem that android doesn't allow this directly. You can try to download some file to determine the speed of your internet. Below are the list of the connection qualities:

  • POOR // Bandwidth under 150 kbps.
  • MODERATE // Bandwidth between 150 and 550 kbps.
  • GOOD // Bandwidth over 2000 kbps.
  • EXCELLENT // Bandwidth over 2000 kbps.
  • UNKNOWN // connection quality cannot be found.

You can check detail in this article https://android.jlelse.eu/designing-android-apps-to-handle-slow-network-speed-dedc04119aac




回答7:


Requires minimum api:21. I use ConnectivityManager combined with NetworkCapabilities to get both the downstream and upstream bandwidth. Works just fine. You can decide whether speed is 2G,3G or 4G level based on the speed in kbps.

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

Downloading a file is over-engineering the solution because after all, you aren't responsible for the users internet connection - they are (or rather their service provider is)! Giving them info based on their current status is more than enough for most use cases. This gives you a speedy way of checking current link speed before performing operations.



来源:https://stackoverflow.com/questions/55159487/android-how-to-determine-network-speed-in-android-programmatically

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!