首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TrafficStats的网络连接速度

使用TrafficStats的网络连接速度
EN

Stack Overflow用户
提问于 2016-07-04 11:02:50
回答 1查看 880关注 0票数 1

我正在开发一个使用互联网连接的安卓应用程序,我想用red for poor连接、yellow for fairgreen for good强度的指示器来监控网络速度,并在状态栏上显示出来,这样用户在使用app时就可以随时知道网络的速度。我碰到了TrafficStats库,在其中我会得到no。使用TrafficStats.getMobileTxbytes()和no传输的字节数。使用TrafficStats.getMobileRxbytes()接收到的字节,但现在我有一个查询要处理。

  • TrafficStats将给出基于当前数据传输的网络速度。因此,如果没有任何传输在最后10秒,它将返回0 0kbps的速度和我们的指示将是红色,而实际的网络是好的,它应该是绿色的。

我只是一个Android的新手,想在这里有一些见解。

还有其他解决这个问题的好办法吗?

EN

回答 1

Stack Overflow用户

发布于 2016-07-04 11:14:28

不幸的是,这些数据只能被估计出来。Android中没有API,可以在指定的时间内给出平均速度。

下面是根据移动网络连接类型(以及外部功能中的单元)来指定平均速度的内容:

代码语言:javascript
复制
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打开时,方法将不同:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38183139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档