17

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

我如何知道每个应用程序使用的数据是什么?

实际上,我需要一个解决方案,它可以在给定的时间段内(即两天之间)提供应用程序的数据使用情况。

4

4 回答 4

11
于 2015-03-16T18:11:38.213 回答
6

您可以使用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;
    }
}
于 2013-07-16T11:54:22.047 回答
3

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));
    }
}
于 2018-11-29T08:35:48.680 回答
0

请注意,此类返回的统计信息会在每次重新启动后重置并从零开始。要访问更强大的历史网络统计数据,请改用NetworkStatsManager

来源:https ://developer.android.com/reference/android/net/TrafficStats

请查看此答案以获取有关如何使用 NetworkStatsManager 的详细信息:https ://stackoverflow.com/a/39412045/6341943

于 2020-03-19T06:24:06.863 回答