Medición de la velocidad de descarga con Java / Android

Estoy trabajando en una aplicación de Android donde necesito, con la mayor exactitud posible, medir la velocidad de descarga de la conexión actual. Aquí está el mejor método que pude encontrar hasta ahora (básicamente comienzo un temporizador, empiezo a descargar una distro de Linux desde un servidor rápido, descargo alrededor de 200 kbytes, luego detengo el temporizador y compruebo el tiempo transcurrido y el total de bytes descargados):

try{ InputStream is = new URL("http://www.domain.com/ubuntu-linux.iso").openStream(); byte[] buf = new byte[1024]; int n = 0; startBytes = TrafficStats.getTotalRxBytes(); /*gets total bytes received so far*/ startTime = System.nanoTime(); while(n<200){ is.read(buf); n++; } endTime = System.nanoTime(); endBytes = TrafficStats.getTotalRxBytes(); /*gets total bytes received so far*/ totalTime = endTime - startTime; totalBytes = endBytes - startBytes; } catch(Exception e){ e.printStackTrace(); } 

Después de eso sólo tengo que dividir el número de bytes transferidos por el tiempo que se toma y dará la velocidad de descarga en bps.

Preguntas : 1. ¿Será este método exacto? 2. ¿Conoces una mejor?

Muchas gracias.

Hay algunos posibles problemas aquí:

  1. Si usted está buscando para hacer esto sobre la marcha en un dispositivo arbitrario (vs en un laboratorio), tendrá que seguir la recomendación de Jeffrey, porque otras aplicaciones pueden consumir ancho de banda que sería reportado por getTotalRxBytes() .

  2. Esto prueba la velocidad de descarga de este host. Si ese es el anfitrión que se comunicará con "cosas reales", eso es genial. O, si sólo necesita una idea genérica de la velocidad de descarga, está bien. Sin embargo, probar la velocidad de descarga desde el sitio A y suponer que será preciso para el sitio B no será fiable, ya que el sitio A y el sitio B podrían no estar en el mismo continente.

  3. Si usted espera hacer esto mucho, el dueño del anfitrión que usted está probando contra puede ser levemente irritado en el costo del ancho de banda, las entradas excesivas del registro, etc. Idealmente, usted lo haría solamente contra algo que usted posee.

  4. Para los planes de datos medidos, 200KB pueden irritar al propietario del dispositivo.

  5. Todas las advertencias estándar sobre el acceso a Internet (por ejemplo, el servidor puede estar inactivo) y los dispositivos móviles (por ejemplo, el usuario puede comenzar en WiFi y salir de la banda, cambiando drásticamente su capacidad de descarga).

Todo lo dicho, haciendo una descarga es la única manera real de medir las velocidades de descarga.

Utilice el siguiente código. Lo usé para medir la velocidad de descarga. No es necesario guardar el archivo con el propósito de medir la velocidad de descarga. Usted también probablemente no necesita usar OkHttp. Lo usé porque se utilizó en nuestro proyecto.

  String downloadURL = "http://test.talia.net/dl/1mb.pak"; MediaType FILE = MediaType.parse("multipart/form-data;"); OkHttpClient downloadClient = new OkHttpClient().newBuilder() .build(); Request download = new Request.Builder() .url(downloadURL) .build(); downloadClient.newCall(download).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if(response!=null) { long startTime = System.currentTimeMillis(); InputStream is = response.body().byteStream(); BufferedInputStream bis = new BufferedInputStream(is); long size = 0; int red = 0; byte[] buf = new byte[1024]; while ((red = bis.read(buf)) != -1) { size += red; } long endTime = System.currentTimeMillis(); double rate = (((size / 1024) / ((endTime - startTime) / 1000)) * 8); rate = Math.round( rate * 100.0 ) / 100.0; String ratevalue; if(rate > 1000) ratevalue = String.valueOf(rate / 1024).concat(" Mbps"); else ratevalue = String.valueOf(rate).concat(" Kbps"); if(is!=null) { is.close(); } if(bis!=null) { bis.close(); } Log.d("download", "download speed = " + ratevalue); } } }); 
  • ¿Cómo puedo probar la aplicación de Android para los errores de red?
  • Square Retrofit Client: ¿Cómo activar / desactivar followRedirects? Cómo interceptar URL de redireccionamiento?
  • TrafficStats Api android y cálculo del uso diario de datos
  • Pérdida severa de paquetes UDP en algunos dispositivos Android
  • Cómo comprobar mi acceso a internet en mi aplicación android
  • Unity3d: Actividad de red de fondo y Unity Run Loop
  • Androide. Aplicación de red para hacer la lista de amigos
  • Asignar dirección IP estática para la red Wifi en Android 3.xy 4.x
  • ¿Necesita el teléfono estar conectado a Internet para que el proveedor de la red pueda determinar una ubicación?
  • ¿Es posible monitorear el tráfico HTTP en Android sabiendo qué solicitud genera peticiones?
  • Bluetooth + Android + topología scatternet
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.