如何使用TrafficStats分别计算2G和3G的数据使用量?

4

当手机处于2G或3G网络时,如何混合/结合以下两个代码以单独计算TX和RX字节?

我有以下代码来识别手机是否连接到EDGE或UMTS网络,它似乎有效,会在显示屏上显示Toast消息。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        PhoneStateListener ConnectionStateListener = new PhoneStateListener() {

            @Override
            public void onDataConnectionStateChanged(int state, int networkType) {
                super.onDataConnectionStateChanged(state, networkType);
                String sState = "";

                switch (networkType) {
                    case TelephonyManager.NETWORK_TYPE_EDGE:   sState = "EDGE (2G)";   break;
                    case TelephonyManager.NETWORK_TYPE_UMTS:   sState = "UMTS (3G)";   break;                    
                }
                Toast.makeText(getApplicationContext(), sState, Toast.LENGTH_SHORT).show();
            }
        };
        telephonyManager.listen(ConnectionStateListener,PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
    }
}

Tech Republic的这个示例中,我获得了用于计算TX和RX字节数的代码。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mStartRX = TrafficStats.getTotalRxBytes();
        mStartTX = TrafficStats.getTotalTxBytes();

        mHandler.postDelayed(mRunnable, 1000);
    }

    //This would be to update the bytes usage every second
    private final Runnable mRunnable = new Runnable() {
        public void run() {
        TextView RX = (TextView)findViewById(R.id.RX);
        TextView TX = (TextView)findViewById(R.id.TX);
        long rxBytes = TrafficStats.getTotalRxBytes()- mStartRX;
        RX.setText(Long.toString(rxBytes));

        long txBytes = TrafficStats.getTotalTxBytes()- mStartTX;
        TX.setText(Long.toString(txBytes));

        mHandler.postDelayed(mRunnable, 1000);
        }
        };
}

也许有人能帮我解决这个问题。非常感谢提前给予的任何建议和帮助。

1个回答

4

如果我理解错了你的问题,请纠正我。

您想要分别计算2G和3G数据的TX和RX。

将必要的代码复制到单个活动中。

使用布尔值is3G并在onDataConnectionStateChanged中更改它

然后触发mRunnable

telephonyManager.listen(ConnectionStateListener,PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);

mHandler.postDelayed(mRunnable, 1000);

mRunnable 内分别测量2G和3G的 rx/tx 字节。

 if(is3G) {
      rxBytes3G = TrafficStats.getTotalRxBytes() - mStartRX - rxBytes2G;
      txBytes3G = TrafficStats.getTotalTxBytes() - mStartTX - txBytes2G;
  } else {
      rxBytes2G = TrafficStats.getTotalRxBytes() - mStartRX - rxBytes3G;
      txBytes2G  = TrafficStats.getTotalTxBytes() - mStartTX - txBytes3G;
  }

更新您的用户界面


你好。非常感谢你的帮助。我按照你说的方法尝试了一下。起初我遇到了一些问题,但是稍微调整了一下就解决了。目前我发现的唯一两个问题是,在一个手机和模拟器上(都是安卓6),即使我关闭了GSM或数据,RX和Tx仍然在不断增长。而在另一个安卓6手机上,这个问题并没有出现。另一个问题是,在安卓6中从断开连接到2G、3G等的变化可以被正确检测到,但是当我在安卓7上测试时却无法工作。也许你可以为这些问题提供建议,或者让我知道是否最好开一个新的帖子。再次感谢你。 - Ger Cas
不太确定导致你提到的问题的原因。如果需要,请尝试在SO上搜索或开一个新的问题。 - shb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接