Как программно показать использование данных всех приложений?
На Android 4.0 и выше у нас есть опции контроля использования данных в телефоне. Пожалуйста, проверьте прилагаемый снимок экрана для дальнейшего понимания.
http://developer.android.com/about/versions/android-4.0-highlights.html
Теперь у меня есть требование проверить эти данные (использование данных всех приложений в определенный период времени / определенные дни) из моего приложения. Как мне этого добиться? Я также использую приведенный ниже класс для деталей использования сети.
http://developer.oesf.biz/em/developer/reference/eggplant/android/net/NetworkStatsHistory.html
Пожалуйста, проверьте ссылки ниже изображения. Мне нужно разработать такое же приложение.
http://developer.android.com/sdk/images/4.0/usage-all-lg.png
http://developer.android.com/sdk/images/4.0/usage-maps-lg.png
Спасибо, что поделились своим кодом, но мне нужно знать данные, используемые каждым приложением, а не всеми приложениями. До сих пор я заметил, что в ссылках никто не говорит об использовании данных отдельных приложений. Я уже знаю, как показать установленные приложения на устройстве. Теперь я хотел бы знать, какие данные используются каждым приложением.
Я использую приведенный ниже код для списка установленных приложений на устройстве.
private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) {
ArrayList<PInfo> res = new ArrayList<PInfo>();
List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
for (int i=0; i<packs.size(); i++) {
PackageInfo p = packs.get(i);
if ((!getSysPackages) && (p.versionName == null)) {
continue ;
}
PInfo newInfo = new PInfo();
newInfo.setAppname(p.applicationInfo.loadLabel(getPackageManager()).toString());
newInfo.setPname(p.packageName);
newInfo.setVersionName(p.versionName);
newInfo.setVersionCode(p.versionCode);
newInfo.setIcon(p.applicationInfo.loadIcon(getPackageManager()));
res.add(newInfo);
}
return res;
}
Как узнать, какие данные используются каждым приложением?
На самом деле мне нужно решение, которое дает данные об использовании приложений в определенный период времени, то есть в течение двух дней.
3 ответа
Во-первых, получите список информации о процессах всех запущенных приложений:
List<RunningAppProcessInfo>
Затем получите UID каждого приложения и затем отправьте и получите трафик приложения:
// Get running processes
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningApps = manager.getRunningAppProcesses();
for (RunningAppProcessInfo runningApp : runningApps) {
// Get UID of the selected process
int uid = ((RunningAppProcessInfo)getListAdapter().getItem(position)).uid;
// Get traffic data
long received = TrafficStats.getUidRxBytes(uid);
long send = TrafficStats.getUidTxBytes(uid);
Log.v("" + uid , "Send :" + send + ", Received :" + received);
}
Вы можете использовать android.net.TrafficStats
для получения сведений об использовании сети.
Пожалуйста, найдите образец программы ниже для того же.
package com.anchit.trafficstatus;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
public class TrafficStatus extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("bytes recvd", "" + android.net.TrafficStats.getMobileRxBytes());
Log.e("Total", "Bytes received" + android.net.TrafficStats.getTotalRxBytes());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Решение от Arunendra, датированное 2015 годом, сразу не сработало для меня в SDK 28 (Pie).
Поэтому я изменил следующим образом:
void networkUsage() {
// Get running processes
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningApps = manager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo runningApp : runningApps) {
long received = TrafficStats.getUidRxBytes(runningApp.uid);
long sent = TrafficStats.getUidTxBytes(runningApp.uid);
Log.d(LOG_TAG, String.format(Locale.getDefault(),
"uid: %1d - name: %s: Sent = %1d, Rcvd = %1d", runningApp.uid, runningApp.processName, sent, received));
}
}
Обратите внимание, что статистика, возвращаемая этим классом, сбрасывается и начинается с нуля после каждой перезагрузки. Чтобы получить доступ к более надежным историческим данным сетевой статистики, используйте вместо этого NetworkStatsManager.
Источник: https://developer.android.com/reference/android/net/TrafficStats
Пожалуйста, посмотрите этот ответ для получения подробной информации о том, как использовать NetworkStatsManager: /questions/31877359/kak-uznat-tekuschee-ispolzovanie-prilozheniya-v-seti-ili-vsego-dazhe-na-android-n/31877368#31877368