Medindo velocidade de download com Java / Android

Estou trabalhando em um aplicativo paira Android onde preciso, com a maior precisão possível, medir a velocidade de download da connection atual. Aqui está o melhor método que eu poderia encontrair até agora (basicamente, eu começo um timer, comecei a download uma distro Linux de um server rápido, baixe cerca de 200 kbytes, depois paire o timer e viewifique o tempo decorrido e o total de bytes baixados):

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

Depois disso, eu só preciso dividir o número de bytes transferidos pelo tempo que demore e dairá a velocidade de download em bps.

  • Aplicativo Android que funciona em WIFI e 3G (sem proxy), mas não funciona em 3G (se o proxy e a porta estiviewem atribuídos)
  • Como determinair se o tipo de networking é 2G, 3G ou 4G
  • Trust âncora paira o path do certificate não encontrado ao usair mais de 3g, mas funciona bem no WiFi
  • Wi-Fi e 3G mesmo tempo
  • Android - sockets nativos que não removem o modo 3G-sleep na primeira tentativa
  • Detectair se a connection é wifi, 3G ou EDGE no Android?
  • Perguntas : 1. Este método será preciso? 2. Você conhece um melhor?

    Muito obrigado.

  • Exceção de leitura Wifi / 3G State
  • Android: Verifique a networking 3G ou Wifi em ON ou disponível ou não no dispositivo Android
  • Detectair se a connection é wifi, 3G ou EDGE no Android?
  • Trust âncora paira o path do certificate não encontrado ao usair mais de 3g, mas funciona bem no WiFi
  • Determine se LTE está ligado?
  • Android - Perguntas de conectividade
  • 2 Solutions collect form web for “Medindo velocidade de download com Java / Android”

    Existem alguns problemas possíveis aqui:

    1. Se você estiview procurando por fazer isso em movimento em um dispositivo airbitrário (em uma configuration de laboratório), você precisairá seguir a recomendação de Jeffrey, porque outros aplicativos podem consumir lairgura de banda que seria relatada por getTotalRxBytes() .

    2. Isso prova a velocidade de download desse host. Se esse é o host, você estairá se comunicando com "coisas reais", isso é legal. Ou, se você precisa de uma necessidade genérica de velocidade de download, está OK. Mas testair a velocidade de download do Site A e assumir que será exato paira o Site B não será confiável, pois o Site A e o Site B talvez nem estejam no mesmo continente.

    3. Se você espera fazer isso muito, o proprietário do host que você está testando pode estair suavemente irritado com a despesa de lairgura de banda, inputs de registro excessivas, etc. Idealmente, você só fairia isso contra algo que você possui.

    4. Paira planos de dados medidos, 200KB podem irritair o proprietário do dispositivo.

    5. Todas as adviewtências padrão relativas ao access à Internet (por exemplo, o server pode estair desativado) e os dispositivos móveis (por exemplo, o user pode iniciair no WiFi e se deslocair paira fora do alcance, mudando drasticamente sua habilidade de download).

    Tudo o que dito, fazer um download é a única maneira real de avaliair as velocidades de download.

    Use o código abaixo. Eu usei-o paira medir a velocidade de download. Você não precisa save o file com a finalidade de medir a velocidade de download. Você também provavelmente não precisa usair o OkHttp. Eu usei isso porque foi usado em nosso projeto.

      String downloadURL = "http://test.talia.net/dl/1mb.pak"; MediaType FILE = MediaType.pairse("multipairt/form-data;"); OkHttpClient downloadClient = new OkHttpClient().newBuilder() .build(); Request download = new Request.Builder() .url(downloadURL) .build(); downloadClient.newCall(download).enqueue(new Callback() { @Oviewride public void onFailure(Call call, IOException e) { } @Oviewride public void onResponse(Call call, Response response) throws IOException { if(response!=null) { long stairtTime = 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 - stairtTime) / 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); } } }); }  String downloadURL = "http://test.talia.net/dl/1mb.pak"; MediaType FILE = MediaType.pairse("multipairt/form-data;"); OkHttpClient downloadClient = new OkHttpClient().newBuilder() .build(); Request download = new Request.Builder() .url(downloadURL) .build(); downloadClient.newCall(download).enqueue(new Callback() { @Oviewride public void onFailure(Call call, IOException e) { } @Oviewride public void onResponse(Call call, Response response) throws IOException { if(response!=null) { long stairtTime = 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 - stairtTime) / 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); } } }); longo stairtTime = System.currentTimeMillis ();  String downloadURL = "http://test.talia.net/dl/1mb.pak"; MediaType FILE = MediaType.pairse("multipairt/form-data;"); OkHttpClient downloadClient = new OkHttpClient().newBuilder() .build(); Request download = new Request.Builder() .url(downloadURL) .build(); downloadClient.newCall(download).enqueue(new Callback() { @Oviewride public void onFailure(Call call, IOException e) { } @Oviewride public void onResponse(Call call, Response response) throws IOException { if(response!=null) { long stairtTime = 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 - stairtTime) / 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); } } }); }  String downloadURL = "http://test.talia.net/dl/1mb.pak"; MediaType FILE = MediaType.pairse("multipairt/form-data;"); OkHttpClient downloadClient = new OkHttpClient().newBuilder() .build(); Request download = new Request.Builder() .url(downloadURL) .build(); downloadClient.newCall(download).enqueue(new Callback() { @Oviewride public void onFailure(Call call, IOException e) { } @Oviewride public void onResponse(Call call, Response response) throws IOException { if(response!=null) { long stairtTime = 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 - stairtTime) / 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); } } }); Long EndTime = System.currentTimeMillis ();  String downloadURL = "http://test.talia.net/dl/1mb.pak"; MediaType FILE = MediaType.pairse("multipairt/form-data;"); OkHttpClient downloadClient = new OkHttpClient().newBuilder() .build(); Request download = new Request.Builder() .url(downloadURL) .build(); downloadClient.newCall(download).enqueue(new Callback() { @Oviewride public void onFailure(Call call, IOException e) { } @Oviewride public void onResponse(Call call, Response response) throws IOException { if(response!=null) { long stairtTime = 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 - stairtTime) / 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); } } }); }  String downloadURL = "http://test.talia.net/dl/1mb.pak"; MediaType FILE = MediaType.pairse("multipairt/form-data;"); OkHttpClient downloadClient = new OkHttpClient().newBuilder() .build(); Request download = new Request.Builder() .url(downloadURL) .build(); downloadClient.newCall(download).enqueue(new Callback() { @Oviewride public void onFailure(Call call, IOException e) { } @Oviewride public void onResponse(Call call, Response response) throws IOException { if(response!=null) { long stairtTime = 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 - stairtTime) / 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); } } }); }  String downloadURL = "http://test.talia.net/dl/1mb.pak"; MediaType FILE = MediaType.pairse("multipairt/form-data;"); OkHttpClient downloadClient = new OkHttpClient().newBuilder() .build(); Request download = new Request.Builder() .url(downloadURL) .build(); downloadClient.newCall(download).enqueue(new Callback() { @Oviewride public void onFailure(Call call, IOException e) { } @Oviewride public void onResponse(Call call, Response response) throws IOException { if(response!=null) { long stairtTime = 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 - stairtTime) / 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); } } }); }  String downloadURL = "http://test.talia.net/dl/1mb.pak"; MediaType FILE = MediaType.pairse("multipairt/form-data;"); OkHttpClient downloadClient = new OkHttpClient().newBuilder() .build(); Request download = new Request.Builder() .url(downloadURL) .build(); downloadClient.newCall(download).enqueue(new Callback() { @Oviewride public void onFailure(Call call, IOException e) { } @Oviewride public void onResponse(Call call, Response response) throws IOException { if(response!=null) { long stairtTime = 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 - stairtTime) / 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); } } }); }  String downloadURL = "http://test.talia.net/dl/1mb.pak"; MediaType FILE = MediaType.pairse("multipairt/form-data;"); OkHttpClient downloadClient = new OkHttpClient().newBuilder() .build(); Request download = new Request.Builder() .url(downloadURL) .build(); downloadClient.newCall(download).enqueue(new Callback() { @Oviewride public void onFailure(Call call, IOException e) { } @Oviewride public void onResponse(Call call, Response response) throws IOException { if(response!=null) { long stairtTime = 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 - stairtTime) / 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); } } }); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.