Comment puis-je trouver l’utilisation des données pour chaque application sur Android?

J’essaie de trouver l’utilisation des données sur Android par application. Quelque chose comme les applications d’utilisation des données Android et les widgets Quota / Cap Monitor: ne recevez jamais de frais supplémentaires pour obtenir des données ou soyez à nouveau couvert! .

J’ai regardé la question de Stack Overflow Comment procéder pour détecter l’utilisation des données dans l’environnement Android .

Mais cela n’a pas été d’une grande aide.


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

J’ai essayé le code ci-dessus comme suggéré par Akos Cz . Cependant, tous les UID sont des nombres, contrairement à app_79 comme vous l’avez mentionné ci-dessus. Est-ce que ça va?

Les liens suivants devraient vous aider à déterminer comment déterminer par programme l’utilisation des données par application.

  • cw-andtuning / TrafficMonitor (GitHub)

  • Créer un moniteur réseau à l’aide de la classe TrafficStats d’Android

  • Statistiques de trafic Android à l’intérieur

Vous devrez implémenter votre code pour utiliser l’API TraficStats et suivre le nombre d’octets envoyés / reçus par UID (application).

Utilisez cette méthode après avoir créé une nouvelle classe 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; Ssortingng package_name = packageInfo.packageName; ApplicationInfo app = null; try { app = pm.getApplicationInfo(package_name, 0); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Ssortingng name = (Ssortingng) 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=Ssortingng.format( "%.2f", total )+" MB"; pi.individual_mb=Ssortingng.format( "%.2f", total ); totalData+=Double.parseDouble(Ssortingng.format( "%.2f", total )); dataHash.add(pi); Log.e(name,Ssortingng.format( "%.2f", total )+" MB"); } } Editor edit=shared.edit(); edit.putSsortingng("Total",Ssortingng.format( "%.2f", totalData)); edit.commit(); } 

Après cela, vous pouvez suivre toutes les utilisations de processus dans MB.

Prorammatiquement:

Vous pouvez déclarer le filtre d’intention pour l’action ACTION_MANAGE_NETWORK_USAGE (introduit dans Android 4.0) pour indiquer que votre application définit une activité qui offre des options pour contrôler l’utilisation des données. ACTION_MANAGE_NETWORK_USAGE affiche les parameters de gestion de l’utilisation des données réseau d’une application spécifique. Lorsque votre application dispose d’une activité de parameters permettant aux utilisateurs de contrôler l’utilisation du réseau, vous devez déclarer ce filtre d’intention pour cette activité. Consultez cette page pour plus d’informations sur la gestion de l’utilisation des données, la gestion de l’utilisation par application .

La définition correcte de ACTION_MANAGE_NETWORK_USAGE est que vous pouvez voir ici .

  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.toSsortingng(rxBytes)); long txBytes = TrafficStats.getTotalTxBytes()- mStartTX; TX.setText(Long.toSsortingng(txBytes)); mHandler.postDelayed(mRunnable, 1000); } }; } 

Vous pouvez également commander https://github.com/commonsguy/cw-andtuning/tree/master/TrafficMonitor

Cet extrait de code fonctionne également pour ceux qui exécutent des applications sur votre appareil.

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