2016-08-08 63 views
7

在我的應用程序中,我希望當我點擊一個按鈕時,它會顯示出確切的互聯網速度。 我已經閱讀了關於這個問題的所有答案,這個問題已經在這個鏈接determining internet speed in androidCalculating Internet Speed in androidInternet Speed in android programming等問了。 但我沒有完全找到我的答案。我用這個:我如何確定我的Android應用程序中的互聯網速度

WifiInfo.getLinkSpeed()

,但它顯示的最大速度。而且我用這個代碼:

TrafficStats

但它並沒有爲我工作。我需要顯示我的網絡速度(即100 kbps)。我怎樣才能做到這一點? 請幫幫我。

回答

3

要確定android應用程序中的網速,首先需要從onlineserver下載一些文件。 爲什麼我們需要下載文件?檢查互聯網下載速度的平均值。

的,你需要像這樣的代碼

private class InternetSpeedTest 
     extends AsyncTask<String, Void, String> { 

    long startTime; 
    long endTime; 
    private long takenTime; 

    @Override 
    protected String doInBackground(String... paramVarArgs) { 

     startTime = System.currentTimeMillis(); 
     Log.d(TAG, "doInBackground: StartTime" + startTime); 

     Bitmap bmp = null; 
     try { 
      URL ulrn = new URL(paramVarArgs[0]); 
      HttpURLConnection con = (HttpURLConnection) ulrn.openConnection(); 
      InputStream is = con.getInputStream(); 
      bmp = BitmapFactory.decodeStream(is); 

      Bitmap bitmap = bmp; 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 99, stream); 
      byte[] imageInByte = stream.toByteArray(); 
      long lengthbmp = imageInByte.length; 

      if (null != bmp) { 
       endTime = System.currentTimeMillis(); 
       Log.d(TAG, "doInBackground: EndTIme" + endTime); 
       return lengthbmp + ""; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 

    } 

    protected void onPostExecute(String result) { 

     if (result != null) { 
      long dataSize = Integer.parseInt(result)/1024; 
      takenTime = endTime - startTime; 
      double s = (double) takenTime/1000; 
      double speed = dataSize/s; 
      Log.d(TAG, "onPostExecute: " + "" + new DecimalFormat("##.##").format(speed) + "kb/second"); 
     } 
    } 

在這段代碼將從Here

在doInBackground您將計算圖像的尺寸下載圖片後點擊這裏下載完成

Bitmap bitmap = bmp; 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 99, stream); 
     byte[] imageInByte = stream.toByteArray(); 
     long lengthbmp = imageInByte.length 

最後一件事就是通過減去結束時間的形式開始時間來計算takenTime並且速度是(size/takenTime)

我希望它適合你

+1

它適用於我 謝謝 –

+1

其我所尋找的 非常感謝 –

0

WifiInfo.getLinkSpeed將爲您提供當前WiFi網絡的最高速度。您的實際WiFi速度將低於此值,具體取決於您對接入點的距離,障礙物,干擾等......這是您的WiFi網絡中的速度。如果您訪問網絡中的設備,傳輸將是速度和其他設備速度之間的最小值。

如果您訪問互聯網,那麼您的WiFi網絡連接到互聯網,您的速度取決於所使用的技術(ADSL,有線,4G,衛星......)和您的互聯網提供商的容量(誰是在你的連接的另一端)。這兩個值通常會隨時間變化,因爲它們取決於使用模式(併發用戶數量,網絡容量,..)

還要記住,當連接到互聯網時,您向其他設備發出請求(大部分時間到服務器)。您獲得的傳輸速度將是您的聯繫服務器的速度&之間的最小值。

總而言之,有太多未知元素可以預測您的網速。

然而,你總是可以計算出它,只是提出一些請求,測量你得到多少千字節(或兆字節),計算它已經花了多長時間,並將其中一個除以另一個。這將是您當前的特定連接速度。

如果您想要更穩定/可信的值,您應該多次重複此操作並使用平均值。這是速度測試儀(www.speedtest.net,testmy.net,...)服務所做的。

+0

非常感謝。但是,你能告訴我如何提出請求並測量我得到多少千字節,如何計算時間?我怎樣才能做到這一點?你能幫我一些代碼嗎? –

0

檢查互聯網連接質量和流量的質量。這個庫可以幫助你..

Facebook - Network Connection Class

網絡連接類是一款Android庫,它允許你找出當前用戶的互聯網連接的質量。該連接被分類爲幾個「連接類」,使其易於開發。該庫通過監聽由您的應用完成的現有互聯網流量並在用戶連接質量發生變化時通知您來做到這一點。然後開發人員可以使用此連接類信息並調整應用程序的行爲(請求質量較低的圖像或視頻,節氣門提前等)。

+0

謝謝親愛的,但你能幫我怎麼使用這個庫嗎?如果可能請在代碼中顯示我。 –

+0

請訪問github頁面,按照該頁面上的說明進行操作。要包含庫 - 你需要在你的gradle依賴項中爲你添加這行代碼app.'compile'c​​om.facebook.network.connectionclass:connectionclass:1.0.1''。 – Sathiamour

相關問題