- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开发了 Android 应用程序,它使用 TrafficStats API 在后台服务中获取所有已安装应用程序的数据使用统计信息。本周早些时候,在三星 Galaxy S5 上,在软件更新后,即 6.0.1,TrafficStats 总是为每个 uid 返回 0。同一应用在 HUAWEI KIW-L21 和 OS 6.0.1 上完美运行。
我收到了一些关于 API 23 及更高版本使用 NetworkStatsManager 类的帖子,有些帖子提到这需要系统级权限。
我也浏览了 NetworkStatsManager 的文档。
任何人都可以成功实现 NetworkStatsManager 以获取总数据使用量和应用程序数据使用量吗?
如果有人真正提供帮助,请提前致谢。
最佳答案
所以我将同时展示使用 TrafficeStats 和 NetworkStatsManager
的两种方法我将获取安装在手机中的所有应用程序的 UID,并使用这两种方式来了解数据使用情况。
你可以引用这个作为一个很好的例子https://github.com/RobertZagorski/NetworkStats前 5 个方法来自他的代码。
//when using NetworkStatsManager you need the subscriber id
private String getSubscriberId(Context context, int networkType) {
if (ConnectivityManager.TYPE_MOBILE == networkType) {
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
return tm.getSubscriberId();
}
return "";
}
// to get mobile data recived
public long getPackageRxBytesMobile(Context context,NetworkStatsManager networkStatsManager,int packageUid) {
NetworkStats networkStats = null;
networkStats = networkStatsManager.queryDetailsForUid(
ConnectivityManager.TYPE_MOBILE,
getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
0,
System.currentTimeMillis(),
packageUid);
NetworkStats.Bucket bucket = new NetworkStats.Bucket();
networkStats.getNextBucket(bucket);
networkStats.getNextBucket(bucket);
return bucket.getRxBytes();
}
// to get mobile data transmitted
public long getPackageTxBytesMobile(Context context,NetworkStatsManager networkStatsManager,int packageUid) {
NetworkStats networkStats = null;
networkStats = networkStatsManager.queryDetailsForUid(
ConnectivityManager.TYPE_MOBILE,
getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
0,
System.currentTimeMillis(),
packageUid);
NetworkStats.Bucket bucket = new NetworkStats.Bucket();
networkStats.getNextBucket(bucket);
return bucket.getTxBytes();
}
// to get wifi data received
public long getPackageRxBytesWifi(NetworkStatsManager networkStatsManager,int packageUid) {
NetworkStats networkStats = null;
networkStats = networkStatsManager.queryDetailsForUid(
ConnectivityManager.TYPE_WIFI,
"",
0,
System.currentTimeMillis(),
packageUid);
NetworkStats.Bucket bucket = new NetworkStats.Bucket();
networkStats.getNextBucket(bucket);
return bucket.getRxBytes();
}
// to get wifi data transmitted
public long getPackageTxBytesWifi(NetworkStatsManager networkStatsManager,int packageUid) {
NetworkStats networkStats = null;
networkStats = networkStatsManager.queryDetailsForUid(
ConnectivityManager.TYPE_WIFI,
"",
0,
System.currentTimeMillis(),
packageUid);
NetworkStats.Bucket bucket = new NetworkStats.Bucket();
networkStats.getNextBucket(bucket);
return bucket.getTxBytes();
}
// print to log all the data usage value per application
public void printAllDataUsage(){
PackageManager pm = getPackageManager();
// get all the applications in the phone
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
NetworkStatsManager networkStatsManager = (NetworkStatsManager) getApplicationContext().getSystemService(Context.NETWORK_STATS_SERVICE);
for (ApplicationInfo packageInfo : packages) {
Log.d("MYLOG", String.valueOf(packageInfo.uid));
Log.d("MYLOG", String.valueOf(packageInfo.name));
Log.d("MYLOG", String.valueOf(packageInfo.packageName));
// get data usage from trafficStats
Log.d("MYLOG", String.valueOf(TrafficStats.getUidRxBytes(packageInfo.uid)));
Log.d("MYLOG", String.valueOf(TrafficStats.getUidTxBytes(packageInfo.uid)));
// get data usage from networkStatsManager using mobile
Log.d("MYLOG", String.valueOf(getPackageRxBytesMobile(this,networkStatsManager,packageInfo.uid)));
Log.d("MYLOG", String.valueOf(getPackageTxBytesMobile(this,networkStatsManager,packageInfo.uid)));
// get data usage from networkStatsManager using wifi
Log.d("MYLOG", String.valueOf(getPackageRxBytesWifi(networkStatsManager,packageInfo.uid)));
Log.d("MYLOG", String.valueOf(getPackageTxBytesWifi(networkStatsManager,packageInfo.uid)));
}
}
关于android - 使用 TrafficeStats 和 NetworkStatsManager 的数据使用统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41761966/
1) 我正在检查 Nougat,我已经拥有以下权限 2) 代码 fragment public long getPackageRxBytesWifi() { NetworkStat
我正在为 Android 6.0 制作一个应用程序,我想使用新类 NetworkStatsManager 来获取移动数据使用情况。 我在 list 中添加了我需要的所有权限并需要权限运行时。 当我调用
我想知道数据使用历史并注意到"new"android-6 NetworkStatsManager这似乎是积极的(我已经使用了 TrafficStats 一段时间,但这不会涵盖重启之前的任何内容)。 来
我已经编写了一段代码来获取网络使用情况,但是 queryDetailsForUid(int networkType, String subscriberId,long startTime, long
我正在将新的 NetworkStats 类与 TrafficStats 进行比较,以测量网络接口(interface)和给定应用程序 (pex Chrome) 的流量 由于 TrafficStats
我需要使用 NetworkStatsManager 为整个设备查询双 SIM 手机中两张 SIM 卡的数据使用情况,因为需要报告每张 SIM 卡 1 天的数据使用情况。因此,我需要使用方法 query
我开发了 Android 应用程序,它使用 TrafficStats API 在后台服务中获取所有已安装应用程序的数据使用统计信息。本周早些时候,在三星 Galaxy S5 上,在软件更新后,即 6.
我正在构建一个数据管理器应用,它需要通过移动和 wifi 接口(interface)报告每个应用的数据使用情况。 在尝试使用方法“NetworkStatsManager.querySummary”时,
获取我在 NetworkStatsManager.queryDetailsForUid 中提供的不同开始时间和结束时间这是我的代码 fragment : 我想获取开始时间和结束时间间隔内的应用程序数据
我编译了应用程序并通过 Google Play 将其分发给用户。我在那里集成了 Firebase Crash,现在我在控制台中看到了很多错误。 Exception java.lang.NoClassD
我是一名优秀的程序员,十分优秀!