2012-09-27 35 views
13

Para el tráfico de la red estadística por APP, lo que estoy usando ahora es Android TrafficStatsandroid estadística 3g de tráfico para cada aplicación, ¿cómo?

que puedo conseguir resultado como el siguiente:

  • Youtube 50.30 MBytes
  • Facebook 21.39 MBytes
  • Google Play 103.38 MBytes
  • (y más ...)

Como sé, los "Android Trafficstats" solo un puntero nativo a un archivo c. (tal vez un .so?)

Pero se mezcló Wifi & 3g de tráfico, ¿hay alguna manera de obtener estadísticas de tráfico no solo WiFi?

+0

qué sistema está utilizando? desde al menos el reenvío de ICS, puede ver el uso de datos en 3g/móvil; wlan; o todo combinado. – SunnySonic

+0

Android 2.2 o superior – RRTW

Respuesta

8

noche todo, tengo una cierta manera de hacer eso ...

En primer lugar tengo que crear una clase que se extiende BroadcasrReceiver, así:

Manifiesto definición:

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

Códigos:

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

Y por debajo de un oyente estadísticas de teléfono ...

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

Finalmente, aquí está mi lógica

  1. Recopilación de cuenta en SQLite DB.
  2. Recopila todo el uso de la red de aplicaciones a través de TrafficStats cada 1 minuto, solo cuando 3G está activado.
  3. Si 3G está DESACTIVADO, entonces deje de recoger.
  4. Si ambos 3G & WiFi están activados, deje de recoger.

Como sé, el tráfico de red pasará solo por WiFi, si están disponibles 3G & WiFi.

-2

Prueba el siguiente código y apague el 'wifi' y comprobar que sólo

  1. Crear un nuevo proyecto androide '3G' en Eclipse. Recuerda usar la clase TrafficStats, debes apuntar a la API para Android 2.2 (Froyo) o superior.

  2. En la carpeta/res/layout crearemos un recurso main.xml. Para este proyecto, solo estamos usando una serie de vistas de texto en un diseño lineal apilado verticalmente.

     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. Con nuestro diseño en su lugar, podemos pasar a la carpeta/src. Crea Main.java extendiendo la clase Activity. Avancemos y declaremos tres variables privadas de clase.

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. Utilizaremos la anulación de crear para inicializar las variables privadas, así como calendario de una devolución de llamada en el subproceso de interfaz de usuario. Anote el cheque de la enumeración TrafficStats.UNSUPPORTED. Si bien mi experiencia con la clase TrafficStats no ha tenido problemas, la documentación oficial de Google indica que algunos dispositivos pueden no admitir este tipo de informes y, cuando ese es el caso, la llamada devuelve el valor antes mencionado. Por esa razón, es una buena idea escribir tu código a la defensiva, como lo he demostrado aquí.

     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. Por último, pero no menos importante tenemos que actualizar nuestra pantalla y volver a programar el ejecutable.

     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

Gracias, pero para obtener el uso de tráfico de red no WiFi, puedo simplemente usar TrafficStats.getMobileTxBytes() y TrafficStats.getMobileRxBytes(). Además, eso no puede hacer que cada aplicación tenga un uso de 3g, y eso es lo que realmente necesito. – RRTW

+0

en realidad toma todas las estadísticas de tráfico del teléfono, para el uso de la aplicación todavía estoy tratando de encontrar la solución, si obtengo lo que voy a publicar para usted –

+0

Para esto, estoy probando otra solución que es: 1) detectar 3G activado 2) Comience a obtener el recuento de tráfico por APP mediante el uso de TrafficStats 3) Detenga el recuento de tráfico cuando se encienda WiFi ........... Otro problema es si 3G y WiFi se activaron. Aún descubriéndolo ... – RRTW

2

me encontré manera de conseguir tráfico solamente wifi

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

ahora wifibyte cadena Show WiFi total de bytes su trabajo para mí, espero que el trabajo para usted

+0

parece no funcionar cuando hay una VPN presente – chksr

4

Después de una larga lucha, estoy en condiciones de encuentre la solución para obtener datos sobre cualquier interfaz para cada aplicación instalada en el dispositivo android .

Como Android proporciona TrafficStats Apis pero estas API proporcionan estadísticas de compilación de datos para cada aplicación uid desde el inicio del dispositivo y Even API no son compatibles para obtener los datos a través de cualquier interfaz para una aplicación en particular. Incluso si confiamos en TraffiucStates APIS, obtenemos una nueva estadística de datos para cada aplicación.

Así que pensé para utilizar las API ocultas para utilizar este ..

Aquí estoy mencionando los pasos para obtener las estadísticas de los datos para cada aplicación a través de cualquier interfaz de Android ...

  1. establecer un "INetworkStatsSession" sesión

    import android.net.INetworkStatsSession; 
    INetworkStatsSession mStatsSession = mStatsService.openSession(); 
    
  2. Crear una plantilla de red de acuerdo con la interfaz que se desea medir ..

    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. Recoge la historia de la red de aplicación correspondiente byt pasar UID de aplicación ...

    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. Obtener los datos Consumo Total:

    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

¿Tiene el enlace de estas clases internas? ¿Necesita compilar o simplemente copiar y pegar? – Pedram

+0

@Pedram Como mencioné en esta solución ... Estamos usando API internas para lograr esto, así que tenemos que compilar la aplicación como sistema y se toman todas las importaciones relacionadas de paquetes en compilación ... – Anshuman

Cuestiones relacionadas