2016-07-04 103 views
1

我正在使用互聯網連接工作的android應用程序。我想監視網絡速度使用指標,這將是red for poor連接,yellow for fairgreen for good強度,並顯示在狀態欄上以便用戶可以在使用應用程序時一直了解網絡速度。我遇到了TrafficStats庫,其中我會得到no。使用TrafficStats.getMobileTxbytes()和no號碼傳輸的字節數。收到的字節使用TrafficStats.getMobileRxbytes(),但現在我有一個查詢來處理。使用TrafficStats網絡連接速度

  • TrafficStats將提供基於當前數據傳輸的網絡速度。因此,如果在過去10秒內沒有任何內容傳輸,它將返回0kbps的速度,我們的指標將是紅色,而實際的網絡是好的,它應該是綠色的。

我只是Android的新手,並希望在這裏獲得一些見解。

還有其他一些好辦法來解決這個問題嗎?

+0

我建議您通過以下網址:https://github.com/eolwral/OSMonitor once。 –

+1

大多數庫不提供您連接到的網絡的速度。它提供了您的設備和您連接的服務器之間的數據傳輸速度。因此,如果您不傳輸數據,則顯示網絡狀態是沒有意義的。 你要做的一件事是,如果你的數據傳輸速率爲0但網絡已連接,則顯示綠色條。 –

+0

@the_unknown_spirit你有任何解決方案,我正在尋找到我的應用程序中實現相同的功能。請指導我,如果你可以感謝 –

回答

0

不幸的是,這些數據只能估計。 Android中沒有API,可以在指定的時間內爲您提供平均速度。

這裏是,我用於指定的平均速度,基於移動網絡連接類型(和在外部功能的單元)作出:

public float mobileNetSpeed(Context context) { 
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
    int networkType = tm.getNetworkType(); 
    float netSpeed = getMobileNetworkSpeed(networkType); 
    return netSpeed; 
} 

private Network.NetworkSpeedUnits getMobileNetworkSpeedUnit(int networkType) { 
    switch (networkType) { 
     case TelephonyManager.NETWORK_TYPE_GPRS: 
     case 16: // TelephonyManager.NETWORK_TYPE_GSM: 
     case TelephonyManager.NETWORK_TYPE_EDGE: 
     case TelephonyManager.NETWORK_TYPE_CDMA: 
     case TelephonyManager.NETWORK_TYPE_1xRTT: 
     case TelephonyManager.NETWORK_TYPE_IDEN: 
     case TelephonyManager.NETWORK_TYPE_UMTS: 
      return Network.NetworkSpeedUnits.KBps; 
     case TelephonyManager.NETWORK_TYPE_EVDO_0: 
     case TelephonyManager.NETWORK_TYPE_EVDO_A: 
     case TelephonyManager.NETWORK_TYPE_HSDPA: 
     case TelephonyManager.NETWORK_TYPE_HSUPA: 
     case TelephonyManager.NETWORK_TYPE_HSPA: 
     case TelephonyManager.NETWORK_TYPE_EVDO_B: 
     case TelephonyManager.NETWORK_TYPE_EHRPD: 
     case TelephonyManager.NETWORK_TYPE_HSPAP: 
     case 17: // TelephonyManager.NETWORK_TYPE_TD_SCDMA: 
     case TelephonyManager.NETWORK_TYPE_LTE: 
     case 18: // TelephonyManager.NETWORK_TYPE_IWLAN: 
      return Network.NetworkSpeedUnits.MBps; 
     default: 
      return Network.NetworkSpeedUnits.KBps; 
    } 
} 

/** 
* Return hypothetical speed of mobile network. This method is an equivalent 
* of {@link TelephonyManager#getNetworkClass()} 
* 
* @param networkType 
* @return network speed by one of the XG type 
*/ 
private float getMobileNetworkSpeed(int networkType) { 
    switch (networkType) { 
     case TelephonyManager.NETWORK_TYPE_GPRS: 
      return 114; 
     case 16: // TelephonyManager.NETWORK_TYPE_GSM: 
      return 0; 
     case TelephonyManager.NETWORK_TYPE_EDGE: 
      return 296; 
     case TelephonyManager.NETWORK_TYPE_CDMA: 
      return 115; 
     case TelephonyManager.NETWORK_TYPE_1xRTT: 
      return 153; 
     case TelephonyManager.NETWORK_TYPE_IDEN: 
      return 60; 
     case TelephonyManager.NETWORK_TYPE_UMTS: 
      return 384; 
     case TelephonyManager.NETWORK_TYPE_EVDO_0: 
      return 2.46F; 
     case TelephonyManager.NETWORK_TYPE_EVDO_A: 
      return 3.1F; 
     case TelephonyManager.NETWORK_TYPE_HSDPA: 
      return 21.6F; 
     case TelephonyManager.NETWORK_TYPE_HSUPA: 
      return 5.76F; 
     case TelephonyManager.NETWORK_TYPE_HSPA: 
      return 14; 
     case TelephonyManager.NETWORK_TYPE_EVDO_B: 
      return 4.9F; 
     case TelephonyManager.NETWORK_TYPE_EHRPD: 
      return 1.285F; 
     case TelephonyManager.NETWORK_TYPE_HSPAP: 
      return 42; 
     case 17: // TelephonyManager.NETWORK_TYPE_TD_SCDMA: 
      return 0; 
     case TelephonyManager.NETWORK_TYPE_LTE: 
      return 100; 
     case 18: // TelephonyManager.NETWORK_TYPE_IWLAN: 
      return 0; 
     default: 
      return 0; 
    } 
} 

然而,上面的代碼將只移動連接工作。當WiFi打開時,方法會有所不同:

public float getWiFiSpeed(Context context) { 
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
    return getWifiNetworkSpeed(wifiInfo); 
} 

/** 
* Return general class of wifi network type. Unfortunately, there is no Android API method 
* to do this, link speed in {@link WifiInfo#LINK_SPEED_UNITS "Mbps"} must be used 
* and a maximum speed of wifi class must be compared with the value returned from 
* {@link WifiInfo#getLinkSpeed()}. 
* 
* @param wifiInfo 
* @return network speed by one of the WIFI_DRAFT_X type 
*/ 
private float getWifiNetworkSpeed(WifiInfo wifiInfo) { 
    if (wifiInfo == null) { 
     return 0; 
    } 
    int linkSpeed = wifiInfo.getLinkSpeed(); //measured using WifiInfo.LINK_SPEED_UNITS 
    return linkSpeed; 
}