web-dev-qa-db-ja.com

すべてのアプリケーションのデータ使用量をプログラムで表示するにはどうすればよいですか?

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

以下のリンク画像をご確認ください。同じ種類のアプリケーションを開発する必要があります。

コードを共有していただきありがとうございます。すべてのアプリケーションではなく、各アプリケーションで使用されるデータを知る必要があります。これまでのところ、リンクでは、個々のアプリケーションのデータ使用について誰も話していません。デバイスにインストールされているアプリケーションを表示する方法はすでに知っています。次に、すべてのアプリケーションで使用されるデータを教えてください。

デバイスにインストールされているアプリケーションのリストに以下のコードを使用しています。

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日間のアプリケーションのデータ使用量を提供するソリューションが必要です。

16
Kiran_b

まず、実行中のすべてのアプリのプロセス情報のリストを取得します。

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

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;
    }
}
6
Anchit Mittal

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

このクラスによって返される統計は、再起動するたびにリセットされ、ゼロから始まることに注意してください。より堅牢な履歴ネットワーク統計データにアクセスするには、代わりに NetworkStatsManager を使用します。

Src: https://developer.Android.com/reference/Android/net/TrafficStats

NetworkStatsManagerの使用方法の詳細については、この回答を参照してください: https://stackoverflow.com/a/39412045/634194

0
hushed_voice