Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo puedo encontrar el uso de datos por aplicación en Android?

Estoy tratando de averiguar el uso de datos en Android en una base por aplicación. Algo como aplicaciones de uso de datos de Android y widgets de control de cuota / tapa: nunca se cobran extra por los datos o se tapa de nuevo! .

Miré la pregunta de desbordamiento de pila Cómo ir sobre la detección de uso de datos en el entorno de Android .

Pero no ha sido de mucha ayuda.


ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); ActivityManager.MemoryInfo mInfo = new ActivityManager.MemoryInfo(); activityManager.getMemoryInfo( mInfo ); List<RunningAppProcessInfo> listOfRunningProcess = activityManager.getRunningAppProcesses(); Log.d(TAG, "XXSize: " + listOfRunningProcess.size()); for (RunningAppProcessInfo runningAppProcessInfo : listOfRunningProcess) { if (runningAppProcessInfo.uid > 1026) { Log.d(TAG, "ANS " + runningAppProcessInfo.processName + " Id :" + runningAppProcessInfo.pid + " UID: " + runningAppProcessInfo.uid); } } 

He intentado el código anterior como sugiere Akos Cz . Sin embargo, todos los UID son números, a diferencia de app_79 como se ha mencionado anteriormente. ¿Está todo bien?

  • Comprobar si mi aplicación tiene acceso de uso habilitado
  • 7 Solutions collect form web for “¿Cómo puedo encontrar el uso de datos por aplicación en Android?”

    Los siguientes enlaces deberían ayudarle a averiguar cómo determinar mediante programación el uso de datos por aplicación.

    • Cw-andtuning / TrafficMonitor (GitHub)

    • Crear un monitor de red con la clase TrafficStats de Android

    • Estadísticas de tráfico de Android

    Deberá implementar su código para usar la API de TraficStats y rastrear el número de bytes enviados / recibidos por UID (aplicación).

    Utilice este método después de crear una nueva clase PackageInformationTotal.

     public void getPakagesInfoUsingHashMap() { final PackageManager pm = getPackageManager(); // get a list of installed apps. List<ApplicationInfo> packages = pm.getInstalledApplications(0); // loop through the list of installed packages and see if the selected // app is in the list for (ApplicationInfo packageInfo : packages) { // get the UID for the selected app UID = packageInfo.uid; String package_name = packageInfo.packageName; ApplicationInfo app = null; try { app = pm.getApplicationInfo(package_name, 0); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } String name = (String) pm.getApplicationLabel(app); Drawable icon = pm.getApplicationIcon(app); // internet usage for particular app(sent and received) double received = (double) TrafficStats.getUidRxBytes(UID) / (1024 * 1024); double send = (double) TrafficStats.getUidTxBytes(UID) / (1024 * 1024); double total = received + send; if(total>0) { PackageInformationTotal pi=new PackageInformationTotal(); pi.name=name; pi.packageName=package_name; pi.icon=icon; pi.totalMB=String.format( "%.2f", total )+" MB"; pi.individual_mb=String.format( "%.2f", total ); totalData+=Double.parseDouble(String.format( "%.2f", total )); dataHash.add(pi); Log.e(name,String.format( "%.2f", total )+" MB"); } } Editor edit=shared.edit(); edit.putString("Total",String.format( "%.2f", totalData)); edit.commit(); } 

    Después de eso, puede realizar un seguimiento de todos los usos del proceso en MB.

    Proramáticamente:

    Puede declarar el filtro de intenciones de la acción ACTION_MANAGE_NETWORK_USAGE (introducida en Android 4.0) para indicar que su aplicación define una actividad que ofrece opciones para controlar el uso de datos. ACTION_MANAGE_NETWORK_USAGE muestra la configuración para administrar el uso de datos de red de una aplicación específica. Cuando su aplicación tiene una actividad de configuración que permite a los usuarios controlar el uso de la red, debe declarar este filtro de intenciones para esa actividad. Compruebe esto para obtener más información acerca de cómo administrar el uso de administración de uso de datos por aplicación .

    La definición correcta de ACTION_MANAGE_NETWORK_USAGE se puede ver aquí .

    Este fragmento también funciona para aquellos que ejecutan aplicaciones en su dispositivo.

      final PackageManager pm = getPackageManager(); ActivityManager activityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses(); //final List<ActivityManager.RunningTaskInfo> recentTasks = activityManager.getRunningTasks(Integer.MAX_VALUE); for (int i = 0; i < appProcesses.size(); i++) { Log.d("Executed app", "Application executed : " + appProcesses.get(i).processName + "\t\t ID: " + appProcesses.get(i).pid + ""); // String packageName = activityManager.getRunningTasks(1).get(0).topActivity.getPackageName(); //String packageName = appProcesses.get(i)..getPackageName(); ApplicationInfo app = null; try { app = pm.getApplicationInfo(appProcesses.get(i).processName, 0); if ((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 1) { //it's a system app, not interested } else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { //Discard this one //in this case, it should be a user-installed app } else { // tx = TrafficStats.getUidTxBytes(app.uid); //rx = TrafficStats.getUidRxBytes(app.uid); long delta_rx = TrafficStats.getUidRxBytes(app.uid) - rx; long delta_tx = TrafficStats.getUidTxBytes(app.uid) - tx; } } 
      public class Main extends Activity { private Handler mHandler = new Handler(); private long mStartRX = 0; private long mStartTX = 0; @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); } } 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); } }; } 

    También puede realizar el checkout https://github.com/commonsguy/cw-andtuning/tree/master/TrafficMonitor

    Ahora existe la opción de utilizar la herramienta DDMS Network Traffic

    http://developer.android.com/training/efficient-downloads/efficient-network-access.html#DDMSNetworkTraffic

    Después de una larga lucha, soy capaz de encontrar 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 están proporcionando estatus de datos completos para cada aplicación uid ya que el arranque del dispositivo e incluso las API no están soportando para obtener los datos sobre cualquier interfaz para una aplicación en particular. Incluso si dependemos de TraffiucStates APIS, obtendremos una nueva estadística de datos para cada aplicación.

    Así que pensé en usar las APIs ocultas para utilizar esto ..

    Aquí estoy mencionando los pasos para obtener la estadística de datos para cada aplicación sobre cualquier interfaz en Android …

    1. Estabalish una sesión "INetworkStatsSession"

      #import android.net.INetworkStatsSession;

    INetworkStatsSession mStatsSession = mStatsService.openSession ();

    1. Crear una red Templeate de acuerdo a interafce que 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())); 
    2. GetActive SubcriberID:

       private static String getActiveSubscriberId(Context context) { final TelephonyManager tele = TelephonyManager.from(context); final String actualSubscriberId = tele.getSubscriberId(); return SystemProperties.get(TEST_SUBSCRIBER_PROP, actualSubscriberId); } 
    3. Recopilar la red HIStory de la aplicación respectiva 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; } 
    4. Obtener el total de datos de consumo:

       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())); } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.