Как я могу найти использование данных для каждого приложения на Android?

Я пытаюсь выяснить использование данных на Android для каждого приложения. Что-то вроде Android Data Usage Apps и Quota / Cap Monitor Widgets: никогда не получите дополнительную плату за данные или снова получите ограничение! ,

Я рассмотрел вопрос о переполнении стека. Как узнать, как использовать данные в среде Android .

Но это не помогло.


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

Я попробовал вышеуказанный код, как предложил Akos Cz . Однако все UID – это номера, в отличие от app_79 как вы уже упоминали выше. Все в порядке?

Следующие ссылки помогут вам понять, как программно определять использование данных для каждого приложения.

  • cw-andtuning / TrafficMonitor (GitHub)

  • Создайте сетевой монитор с помощью classа TrafficStats от Android

  • Статистика Android Traffic Inside

Вам нужно будет реализовать свой код для использования API TraficStats и отслеживать количество отправленных и полученных байтов на каждый UID (приложение).

Используйте этот метод после создания нового 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(); } 

После этого вы можете отслеживать все процессы в MB.

Prorammatically:

Вы можете объявить фильтр намерений для действия ACTION_MANAGE_NETWORK_USAGE (представленный в Android 4.0), чтобы указать, что ваше приложение определяет действие, которое предлагает параметры управления использованием данных. ACTION_MANAGE_NETWORK_USAGE показывает настройки для управления использованием сетевых данных для конкретного приложения. Когда ваше приложение имеет активность настроек, которая позволяет пользователям контролировать использование сети, вы должны объявить этот фильтр намерений для этой активности. Проверьте это для получения дополнительной информации об управлении использованием данных для управления использованием для каждого приложения .

Правильное определение ACTION_MANAGE_NETWORK_USAGE вы можете посмотреть здесь .

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

Вы также можете проверить https://github.com/commonsguy/cw-andtuning/tree/master/TrafficMonitor

Этот fragment также работает для тех, кто действительно запускает приложения на вашем устройстве

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

После долгой борьбы я могу найти решение для получения данных по любому интерфейсу для каждого установленного приложения в устройстве Android.

Поскольку Android обеспечивает TrafficStats Apis, но эти API предоставляют полный dataset для каждого приложения, так как загрузка устройства и даже API не поддерживают получение данных по любому интерфейсу для конкретного приложения. Даже если мы полагаемся на TraffiucStates APIS, мы получаем новую статистику statstics для каждого Приложения.

Поэтому я решил использовать скрытые API для использования этого.

Здесь я упоминаю шаги, чтобы получить статистику statstics для каждого приложения через любой интерфейс в Android …

  1. Создание сеанса «INetworkStatsSession»

    #import android.net.INetworkStatsSession;

INetworkStatsSession mStatsSession = mStatsService.openSession ();

  1. Создайте сетевой Храмовый в соответствии с interafce, который вы хотите измерить.

     #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. Собирайте сеть HIStory соответствующего приложения byt, передавая UID приложений …

      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. Получить общие данные о потреблении:

     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())); } 
Давайте будем гением компьютера.