TrafficStats Api android y cálculo del uso diario de datos

Tenga una confusión sobre dos métodos de TrafficStats de Android: getUidTxBytes (int uid) y getUidRxBytes (int uid) , Estos dos métodos devuelve el número de bytes transmitidos y recibidos a través de la red para este UID.Pero ¿cuál es la unidad de tiempo de la misma , Es por segundo. Si quiero calcular los datos transmitidos y recibidos por día por aplicación, ¿qué debo hacer. I thoght una manera, para almacenar datos en sql y seguir añadiendo datos a la table.Is forma correcta.

Estos son contadores "desde que la interfaz subió" o "desde que la aplicación con este UID ha comenzado". Así que decir si su teléfono entra en "modo de avión" y luego volver, los contadores podrían comenzar de cero de nuevo. Si necesita valores por segundo, tendrá que llamar a estas funciones cada segundo y, a continuación, utilizar el delta de la última llamada. Si el delta es negativo, utilice el valor tal cual, significa que el contador empezó de cero de nuevo.

Una cosa más: Por lo que sé, estos contadores cuentan TCP / IP sólo. No UDP. Así que si necesita una contabilidad muy precisa, y la aplicación en cuestión utiliza UDP / IP, o cualquier otro protocolo además de TCP, estos contadores estarán equivocados.

Para la idea de cómo funciona esta función, mira la fuente de Android, libremente disponible. El archivo en cuestión es ./frameworks/base/core/jni/android_net_TrafficStats.cpp

Esta función obtiene los datos de /proc/uid_stat/[uid]/tcp_snd . Si necesita más información al respecto, tendrá que sumergirse en el kernel de Linux …

Estos contadores contienen el recuento de bytes desde el último reinicio. Algunos teléfonos que estos contadores pueden restablecer periódicamente, pero la mayoría de las veces sólo se reinician después de un reinicio. Entrar en modo avión o cambiar entre móvil y Wi-Fi no restablecerá estos contadores.

Un punto importante es que estos contadores no incluyen sobrecarga de paquete, sólo el tamaño de la carga útil. Por lo general, esto significa que 3-4% de los datos pueden no tener en cuenta. Sin embargo, si se trata de una aplicación de streaming, torrent o VoIP donde las cargas útiles de paquetes son pequeñas, puede haber una cantidad mucho mayor de datos desconocidos.

Curiosamente, getTotalRxBytes (bytes recibidos en todas las interfaces, ex móviles y Wi-Fi combinados) y getMobileRxBytes (sólo los bytes recibidos en la interfaz para móviles) incluyen todos los bytes incluyendo la sobrecarga. Así que, básicamente, el total de bytes de la aplicación será menor que el total de bytes de la interfaz, y por lo tanto menor que la cantidad de datos que le está cobrando su operador de red.

Un último punto, la mayoría de las aplicaciones de streaming no tienen en cuenta sus datos con su propio UID. Se contabilizan bajo el UID system.media. Por lo tanto, si está supervisando el uso de datos para YouTube, sólo una cantidad muy pequeña de datos aparecerá en esa aplicación; El resto estará bajo el UID de medios (1013).

Aquí, obtengo esas aplicaciones, que tienen permiso de Internet, Puedes cambiar el nombre de permiso y obtener aplicaciones según necesitas.

 ArrayList<AppObject> listApps; public void getAllAppList() { listApps = new ArrayList<AppObject>(); PackageManager p = getPackageManager(); List<ApplicationInfo> packages = p.getInstalledApplications(PackageManager.GET_META_DATA); for (ApplicationInfo applicationInfo : packages) { try { PackageInfo packageInfo = p.getPackageInfo(applicationInfo.packageName, PackageManager.GET_PERMISSIONS); String[] permissions = packageInfo.requestedPermissions; for (String permissionName : permissions) { if (permissionName.equals("android.permission.INTERNET")) { ApplicationInfo appInfo = packageInfo.applicationInfo; AppObject appObject = new AppObject(); appObject.appDrawable = getPackageManager().getApplicationIcon(appInfo); appObject.appName = (String) getPackageManager().getApplicationLabel(appInfo); appObject.dataUsage = getDataUsage(appInfo); listApps.add(appObject); } } } catch (NullPointerException e) { e.printStackTrace(); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } Debug.e("APP_SIZE", ":" + listApps.size()); appsAdapter.addAll(listApps); } public String getDataUsage(ApplicationInfo appInfo) { int uid = appInfo.uid; double received = (double) TrafficStats.getUidRxBytes(uid) / (1024 * 1024); double sent = (double) TrafficStats.getUidTxBytes(uid) / (1024 * 1024); double total = received + sent; return String.format("%.2f", total) + " MB"; } 

GetUidRxBytes () y getUidTxBytes () se utilizan básicamente para bytes recibidos y transmitidos, respectivamente. Para monitorear los datos de cada aplicación solo busca el uid de cada proceso y encuentra los datos correspondientes a cada proceso y éstos serán los datos de cada aplicación y podrás usar este código para los cálculos.

  TextView totData = (TextView)findViewById(R.id.totData); TextView wifiTot = (TextView)findViewById(R.id.wifitotData); TextView wifiTX = (TextView)findViewById(R.id.wifiUpData); TextView wifiRX = (TextView)findViewById(R.id.wifiDownData); TextView mobileTot = (TextView)findViewById(R.id.mobtotData); TextView mobTX = (TextView)findViewById(R.id.mobUpData); TextView mobRX = (TextView)findViewById(R.id.mobDownData); /* * Converting bytes to MB */ long rxBytes = TrafficStats.getTotalRxBytes()/1048576; long txBytes = TrafficStats.getTotalTxBytes()/1048576; long mobUpload = TrafficStats.getMobileTxBytes()/1048576; long mobDown = TrafficStats.getMobileRxBytes()/1048576; long wifiUpload = txBytes-(mobUpload); long wifiDown = rxBytes-(mobDown); wifiRX.setText(Long.toString(wifiDown)); wifiTX.setText(Long.toString(wifiUpload)); long wifitot = wifiUpload+wifiDown; wifiTot.setText(Long.toString(wifitot)); mobTX.setText(Long.toString(mobUpload)); mobRX.setText(Long.toString(mobDown)); long mobTot = mobUpload+mobDown; mobileTot.setText(Long.toString(mobTot)); totData.setText(Long.toString(wifitot+mobTot)); 
  • Conexión a IIS Express mediante el emulador de Android
  • ¿Cómo hacer que Android Virtual Device acceda a Internet?
  • Bluetooth + Android + topología scatternet
  • La red de Android es inaccesible - ENETUNREACH
  • Cómo obtener la ubicación de la torre actual del operador de red en android
  • Prueba de conexión a Internet de Android
  • DTN (Delay Tolerant Networking) en Android
  • ¿Es posible monitorear el tráfico HTTP en Android sabiendo qué solicitud genera peticiones?
  • NetworkInfo.isConnected () devuelve true pero no hay conexión
  • Pérdida severa de paquetes UDP en algunos dispositivos Android
  • Impedir que WebView cargue la URL en Android (React Native)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.