15

APPごとの統計ネットワークトラフィックの場合、現在使用しているのはAndroidTrafficStatsです。

次のような結果が得られること:

  • Youtube50.30メガバイト
  • Facebook 21.39 MBytes
  • GooglePlay103.38メガバイト
  • (もっと...)

私が知っているように、「AndroidTrafficstats」はacファイルへの単なるネイティブポインタです。(多分.so?)

しかし、Wifiと3gのトラフィックが混在しているので、WiFi以外のトラフィックの統計のみを取得する方法はありますか?

4

4 に答える 4

8

すべての夕方、私はそれを行うためのいくつかの方法を持っています...

まず、次のように、BroadcasrReceiver を拡張するクラスを作成する必要があります。

マニフェスト定義:

<receiver android:name=".core.CoreReceiver" android:enabled="true" android:exported="false">
  <intent-filter>
    <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" />
    <action android:name="android.net.wifi.STATE_CHANGE" />
  </intent-filter>
</receiver>

コード:

/**
 * @author me
 */
public class CoreReceiver extends BroadcastReceiver {
  public void onReceive(Context context, Intent intent) {
    if (Constants.phone == null) {
      // Receive [network] event
      Constants.phone=new PhoneListen(context);
      TelephonyManager telephony=(TelephonyManager) 
      context.getSystemService(Context.TELEPHONY_SERVICE);
      telephony.listen(Constants.phone, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
    }

    WifiManager wifi=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
    boolean b=wifi.isWifiEnabled();
    if (Constants.STATUS_WIFI != b) {
       // WiFi status changed...
    }
  }
}

そして、以下の電話統計リスナー...

public class PhoneListen extends PhoneStateListener {
  private Context context;    
  public PhoneListen(Context c) {
     context=c;
  }    
  @Override
  public void onDataConnectionStateChanged(int state) {
    switch(state) {
      case TelephonyManager.DATA_DISCONNECTED:// 3G
        //3G has been turned OFF
      break;
      case TelephonyManager.DATA_CONNECTING:// 3G
        //3G is connecting
      break;
      case TelephonyManager.DATA_CONNECTED:// 3G
        //3G has turned ON
      break;
    }
  }
}

最後に、これが私のロジックです

  1. カウントを SQLite DB に収集します。
  2. 3G がオンの場合にのみ、TrafficStats を介してすべてのアプリ ネットワーク使用量を 1 分ごとに収集します。
  3. 3G がオフの場合は、収集を停止します。
  4. 3G と WiFi の両方がオンになっている場合は、収集を停止します。

私が知っているように、3G と WiFi の両方が利用可能な場合、ネットワーク トラフィックは WiFi のみを経由します。

于 2012-10-11T10:07:12.110 に答える
-2

次のコードを試して、「WIFI」をオフにし、「3G」のみで確認してください

  1. Eclipse で新しい Android プロジェクトを作成します。Android 2.2 (Froyo) 以降の API をターゲットにする必要がある TrafficStats クラスを使用することを忘れないでください。

  2. /res/layout フォルダーに main.xml リソースを作成します。このプロジェクトでは、縦に積み上げられた線形レイアウトで一連のテキスト ビューを使用しています。

          main.xml
    
         <?xml version="1.0" encoding="utf-8"?>
    
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
         android:layout_width="fill_parent"
    
         android:layout_height="fill_parent"
    
         android:orientation="vertical" >
    
         <TextView
    
         android:layout_width="fill_parent"
    
         android:layout_height="wrap_content"
    
         android:textSize="16sp"
    
         android:textStyle="bold"
    
         android:gravity="center"
    
         android:paddingBottom="20dip"
    
         android:text="Traffic Stats Demo" />
    
         <TextView
    
         android:layout_width="fill_parent"
    
         android:layout_height="wrap_content"
    
         android:textSize="14sp"
    
         android:textColor="#00ff00"
    
         android:gravity="center"
    
         android:text="Transmit Bytes" />
    
         <TextView
    
         android:layout_width="fill_parent"
    
         android:layout_height="wrap_content"
    
         android:textSize="14sp"
    
         android:gravity="center"
    
         android:text="0"
    
         android:id="@+id/TX"/>
    
        <TextView
    
        android:layout_width="fill_parent"
    
        android:layout_height="wrap_content"
    
        android:textSize="14sp"
    
        android:textColor="#ff0000"
    
        android:gravity="center"
    
        android:text="Receive Bytes" />
    
        <TextView
    
        android:layout_width="fill_parent"
    
        android:layout_height="wrap_content"
    
        android:textSize="14sp"
    
        android:gravity="center"
    
        android:text="0"
    
        android:id="@+id/RX"/>
    
        </LinearLayout>
    
  3. レイアウトが整ったら、/src フォルダーに移動できます。Activity クラスを拡張して Main.java を作成します。また、先に進み、3 つのプライベート クラス変数を宣言しましょう。

Main.java

     package com.authorwjf;

     import android.app.Activity;

     import android.app.AlertDialog;

     import android.net.TrafficStats;

     import android.os.Bundle;

     import android.os.Handler;

     import android.widget.TextView;

     public class Main extends Activity {

     private Handler mHandler = new Handler();

     private long mStartRX = 0;

     private long mStartTX = 0;

      }
  1. on create オーバーライドを使用してプライベート変数を初期化し、UI スレッドでコールバックをスケジュールします。enum TrafficStats.UNSUPPORTED のチェックをメモします。TrafficStats クラスでの私の経験には問題はありませんでしたが、Google の公式ドキュメントによると、一部のデバイスはこのタイプのレポートをサポートしていない可能性があり、その場合、呼び出しは前述の値を返します。そのため、ここで説明したように、コードを防御的に記述することをお勧めします。

          Main.java
    
         @Override
    
         public void onCreate(Bundle savedInstanceState) {
    
         super.onCreate(savedInstanceState);
    
         setContentView(R.layout.main);
    
         mStartRX = TrafficStats.getTotalRxBytes();
    
         mStartTX = TrafficStats.getTotalTxBytes();
    
         if (mStartRX == TrafficStats.UNSUPPORTED || mStartTX ==     TrafficStats.UNSUPPORTED) {
    
          AlertDialog.Builder alert = new AlertDialog.Builder(this);
    
          alert.setTitle("Uh Oh!");
    
         alert.setMessage("Your device does not support traffic stat monitoring.");
    
         alert.show();
    
         } else {
    
         mHandler.postDelayed(mRunnable, 1000);
    
         }
    
           }
    
  2. 最後になりましたが、表示を更新してランナブルを再スケジュールする必要があります。

          Main.java
    
          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);
    
               }
    
               };
    
于 2012-09-27T04:08:35.893 に答える