Подтвердить что ты не робот

Как я могу найти использование данных для каждого приложения на 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<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);
    }
}

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Prorammatically:

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

Правильное определение ACTION_MANAGE_NETWORK_USAGE - это здесь.

Ответ 4

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

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

Ответ 5

 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

Ответ 7

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

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

Поэтому я подумал использовать скрытые API-интерфейсы, чтобы использовать это.

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

  • Установите сеанс "INetworkStatsSession"

    #import android.net.INetworkStatsSession;

INetworkStatsSession mStatsSession = mStatsService.openSession();

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

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