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;
}
各アプリケーションで使用されているデータを確認するにはどうすればよいですか?
実際には、特定の期間、つまり2日間のアプリケーションのデータ使用量を提供するソリューションが必要です。
まず、実行中のすべてのアプリのプロセス情報のリストを取得します。
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;
}
}
2015年付けのArunendraのソリューションは、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 を使用します。
Src: https://developer.Android.com/reference/Android/net/TrafficStats
NetworkStatsManagerの使用方法の詳細については、この回答を参照してください: https://stackoverflow.com/a/39412045/634194