Come posso trovare l’utilizzo dei dati per applicazione su Android?

Sto cercando di scoprire l’utilizzo dei dati su Android in base alle singole applicazioni. Qualcosa come le app per l’utilizzo dei dati Android e i widget per monitor Quota / Cap: non ti verrà mai addebitato alcun costo aggiuntivo per i dati o ricoprirai di nuovo! .

Ho esaminato la domanda Stack Overflow Come fare per rilevare l’utilizzo dei dati nell’ambiente Android .

Ma non è stato di grande aiuto.


ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); ActivityManager.MemoryInfo mInfo = new ActivityManager.MemoryInfo(); activityManager.getMemoryInfo( mInfo ); List 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); } } 

Ho provato il codice di cui sopra come suggerito da Akos Cz . Tuttavia tutti gli UID sono numeri, a differenza di app_79 come hai menzionato sopra. Va tutto bene?

Solutions Collecting From Web of "Come posso trovare l’utilizzo dei dati per applicazione su Android?"

I seguenti collegamenti dovrebbero aiutare a capire come determinare a livello di programmazione l’utilizzo dei dati per applicazione.

  • cw-andtuning / TrafficMonitor (GitHub)

  • Crea un monitor di rete utilizzando la class TrafficStats di Android

  • Statistiche sul traffico Android all’interno

È necessario implementare il codice per utilizzare l’API TraficStats e tenere traccia del numero di byte inviati / ricevuti per UID (applicazione).

Utilizzare questo metodo dopo aver creato una nuova class PackageInformationTotal.

 public void getPakagesInfoUsingHashMap() { final PackageManager pm = getPackageManager(); // get a list of installed apps. List 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(); } 

Successivamente è ansible tenere traccia di tutti gli utilizzi del processo in MB.

Prorammatically:

È ansible dichiarare il filtro intent per l’azione ACTION_MANAGE_NETWORK_USAGE (introdotto in Android 4.0) per indicare che l’applicazione definisce un’attività che offre opzioni per controllare l’utilizzo dei dati. ACTION_MANAGE_NETWORK_USAGE mostra le impostazioni per la gestione dell’utilizzo dei dati di rete di un’applicazione specifica. Quando l’app ha un’attività di impostazioni che consente agli utenti di controllare l’utilizzo della rete, è necessario dichiarare questo filtro di intenti per tale attività. Controlla questo per ulteriori informazioni sulla gestione dell’utilizzo dei dati gestisci l’utilizzo per applicazione .

La definizione corretta di ACTION_MANAGE_NETWORK_USAGE è visibile qui .

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

Puoi anche effettuare il checkout a https://github.com/commonsguy/cw-andtuning/tree/master/TrafficMonitor

Questo frammento funziona anche per le app in esecuzione sul tuo dispositivo

 final PackageManager pm = getPackageManager(); ActivityManager activityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); List appProcesses = activityManager.getRunningAppProcesses(); //final List 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; } } 

Dopo una lunga lotta, sono in grado di trovare la soluzione per ottenere dati su qualsiasi interfaccia per ogni applicazione installata nel dispositivo Android.

Come Android fornisce TrafficStats Apis ma queste API forniscono stials Data comple per ogni app delle applicazioni poiché l’avvio del dispositivo e le API Even non supportano l’acquisizione dei dati su qualsiasi interfaccia per una particolare applicazione. Anche se ci affidiamo all’APIS di TraffiucStates, riceviamo una nuova statistica per ogni applicazione.

Quindi ho pensato di usare le API nascoste per usarlo ..

Qui sto menzionando i passaggi per ottenere le statistiche di dati per ogni applicazione su qualsiasi interfaccia in Android …

  1. Stabilire una sessione “INetworkStatsSession”

    #import android.net.INetworkStatsSession;

INetworkStatsSession mStatsSession = mStatsService.openSession ();

  1. Crea un template di rete in base all’interfetta che vuoi misurare ..

     #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. Colleziona la rete HIStory della rispettiva applicazione passando gli UID delle applicazioni …

      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. Ottieni i dati di consumo totali:

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

Ora c’è la possibilità di utilizzare lo strumento Traffico di rete DDMS

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