2012-09-27 6 views
13

Für statistischen Netzwerkverkehr pro APP, was ich jetzt benutze ist Android TrafficStatsAndroid-Statistik 3g Verkehr für jede APP, wie?

Dass ich wie folgendes Ergebnis kann:

  • Youtube 50.30 MBytes
  • Face 21.39 MBytes
  • Google Play 103,38 MBytes
  • (mehr ...)

Wie ich weiß, "Android Trafficstats" nur ein nativer Zeiger auf eine c-Datei. (vielleicht ein .so?)

Aber es gemischt Wifi & 3g Verkehr, gibt es eine Möglichkeit, nur Non-WiFi-Traffic-Statistik zu erhalten?

+0

Welches System verwenden Sie? ab mindestens ICS forward können Sie die Datennutzung von 3g/Handy sehen; Wlan; oder alles kombiniert. – SunnySonic

+0

Android 2.2 oder höher – RRTW

Antwort

8

Abend alle, bekam ich eine Möglichkeit, das zu tun ...

Zuerst habe ich eine Klasse erstellen, die BroadcasrReceiver erstreckt, wie folgt aus:

Manifest Definition:

<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> 

Codes:

/** 
* @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... 
    } 
    } 
} 

und Telefon Statistiken Zuhörer unten ...

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; 
    } 
    } 
} 

Schließlich ist hier meine Logik

  1. Sammeln Sie die Anzahl in SQLite DB.
  2. Sammeln Sie alle App-Netzwerknutzung über TrafficStats alle 1 Minute, nur wenn 3G eingeschaltet ist.
  3. Wenn 3G ausgeschaltet ist, hören Sie auf zu sammeln.
  4. Wenn beide 3G & WiFi ON sind, hören Sie auf zu sammeln.

Wie ich weiß, Netzwerkverkehr wird nur über WiFi gehen, wenn beide 3G & WiFi verfügbar sind.

-2

Versuchen Sie den folgenden Code ein und schalten Sie den 'WiFi' und überprüfen Sie mit nur '3G'

  1. Erstellen Sie ein neues Android-Projekt in Eclipse. Denken Sie daran, die TrafficStats-Klasse zu verwenden, auf die Sie die API für Android 2.2 (Froyo) oder höher ausrichten müssen.

  2. Im Ordner/res/layout erstellen wir eine main.xml-Ressource. Für dieses Projekt verwenden wir nur eine Reihe von Textansichten in einem vertikal gestapelten linearen Layout.

     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. Mit unserem Layout können wir zum Ordner/src wechseln. Erstellen Sie Main.java, indem Sie die Activity-Klasse erweitern. Lassen Sie uns weitergehen und drei private Klassenvariablen deklarieren.

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. Wir werden das schaffen verwenden, um auf Überschreibung unsere privaten Variablen zu initialisieren, sowie Zeitplan ein Rückruf auf dem UI-Thread. Notieren Sie sich den Check für die Enum TrafficStats.UNSUPPORTED. Meine Erfahrung mit der TrafficStats-Klasse verlief reibungslos. In der offiziellen Google-Dokumentation heißt es jedoch, dass einige Geräte diese Art der Berichterstellung möglicherweise nicht unterstützen. Wenn dies der Fall ist, gibt der Aufruf den oben genannten Wert zurück. Aus diesem Grund ist es eine gute Idee, Ihren Code defensiv zu schreiben, wie ich hier gezeigt habe.

     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. Last but not least müssen wir unsere Anzeige aktualisieren und die runnable neu planen.

     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); 
    
          } 
    
          }; 
    
+0

Vielen Dank, aber um den Non-WiFi-Netzwerkverkehr zu nutzen, kann ich TrafficStats.getMobileTxBytes() und TrafficStats.getMobileRxBytes() verwenden. Auch das kann nicht jede APP von 3g Nutzung bekommen, und das ist es, was ich wirklich brauche. – RRTW

+0

tatsächlich dauert es die gesamte Telefon-Traffic-Statistik, für die Anwendung Verwendung bin immer noch versucht, die Lösung zu finden, wenn ich bekomme, als ich für Sie posten –

+0

Dafür versuche ich eine andere Lösung, die ist: 1) Erkennen 3G eingeschaltet 2) Starten Sie die Anzahl der Zugriffe per APP, indem Sie TrafficStats verwenden. 3) Stoppen Sie die Anzahl der Zugriffe, wenn WiFi eingeschaltet ist ... Ein weiteres Problem ist, wenn 3G & WiFi beide eingeschaltet sind? Finden Sie es heraus ...... – RRTW

2

fand ich Art und Weise nur WLAN-Traffic

long totalbyte = Trafficstats.getTotalRxBytes(); 
long mobilenetworkbyte = Trafficstats.getMobileRxBytes(); 
String total = Long.toString(totalbyte); 
String mobile = Long.toString(mobilenetworkbyte); 
String wifibyte = total - mobile + "kb"; 

jetzt wifibyte String Show zu bekommen wifi Gesamt Byte für mich seine Arbeit, die ich hoffe, dass

+0

scheint nicht zu funktionieren, wenn es ein VPN gibt present – chksr

4

Nach einem langen Kampf für Sie arbeiten, ich bin in der Lage zu finden Sie die Lösung für den Erhalt von Daten über jede Schnittstelle für jede installierte Anwendung in Android Gerät.

Als Android bietet TrafficStats Apis aber diese APIs Datenstatistiken für jede App uid da Gerät Boot kompilieren bereitstellen und auch APIs unterstützen die Daten nicht über jede Schnittstelle für eine bestimmte Anwendung zu erhalten. Auch wenn wir uns über TraffiucStates APIS verlassen, erhalten wir für jede Anwendung eine neue Datenstatistik.

Also dachte ich, die versteckten APIs zu verwenden, um dies zu verwenden ..

Hier bin ich die Treppe zu erwähnen, die Datenstatistiken für jede Anwendung über jede Schnittstelle in Android zu bekommen ...

  1. Stellen Sie eine „INetworkStatsSession“ Sitzung

    import android.net.INetworkStatsSession; 
    INetworkStatsSession mStatsSession = mStatsService.openSession(); 
    
  2. erstellen eines Netzwerkvorlage nach Schnittstelle, die Sie messen möchten ..

    import static android.net.NetworkTemplate.buildTemplateEthernet; 
    import static android.net.NetworkTemplate.buildTemplateMobile3gLower; 
    import static android.net.NetworkTemplate.buildTemplateMobile4g; 
    import static android.net.NetworkTemplate.buildTemplateMobileAll; 
    import static android.net.NetworkTemplate.buildTemplateWifiWildcard; 
    
    import android.net.NetworkTemplate; 
    
    private NetworkTemplate mTemplate; 
    
    mTemplate = buildTemplateMobileAll(getActiveSubscriberId(this 
          .getApplicationContext())); 
    
  3. GetActive SubscriberId:

    private static String getActiveSubscriberId(Context context) { 
        final TelephonyManager tele = TelephonyManager.from(context); 
        final String actualSubscriberId = tele.getSubscriberId(); 
        return SystemProperties.get(TEST_SUBSCRIBER_PROP, actualSubscriberId); 
    } 
    
  4. Sammle das Netzwerk Geschichte der jeweiligen Anwendung BYT UIDs Anwendung vorbei ...

    private NetworkStatsHistory collectHistoryForUid(NetworkTemplate template, 
        int uid, int set) throws RemoteException { 
        final NetworkStatsHistory history = mStatsSession.getHistoryForUid(
          template, uid, set, TAG_NONE, FIELD_RX_BYTES | FIELD_TX_BYTES); 
        return history; 
    
    } 
    
  5. Holen Sie sich den gesamten Datenverbrauch:

    public void showConsuption(int UID){ 
        NetworkStatsHistory history = collectHistoryForUid(mTemplate, UID, 
          SET_DEFAULT); 
    
        Log.i(DEBUG_TAG, "load:::::SET_DEFAULT:.getTotalBytes:"+ Formatter.formatFileSize(context, history.getTotalBytes())); 
    
        history = collectHistoryForUid(mTemplate, 10093, 
          SET_FOREGROUND); 
        Log.i(DEBUG_TAG, "load::::SET_FOREGROUND::.getTotalBytes:"+ Formatter.formatFileSize(context, history.getTotalBytes())); 
    
        history = collectHistoryForUid(mTemplate, 10093, 
          SET_ALL); 
        Log.i(DEBUG_TAG, "load::::SET_ALL::.getTotalBytes:"+ Formatter.formatFileSize(context, history.getTotalBytes())); 
    
    } 
    
+0

Haben Sie den Link dieser internen Klassen? Muss es kompilieren oder es ist nur eine einfache Kopie und einfügen? – Pedram

+0

@Pedram Wie ich in dieser Lösung erwähnt..Wir verwenden interne APIs, um dies zu erreichen, so dass wir die Anwendung als System-App erstellen müssen und es alle zugehörigen Importe von Paketen in kompiliert ... – Anshuman

Verwandte Themen