安卓NetworkStatsManager使用及demo

目录

  • 一、TrafficStats类简介
  • 二、demo示例


一、TrafficStats类简介

TrafficStats
Android API 8提供了android.net.TrafficStats类。
通过此类能获取设备重启以来网络信息,部分函数如下所示:

static long  getMobileRxBytes()  //获取通过移动数据网络收到的字节总数
static long  getMobileTxBytes()  //通过移动数据网发送的总字节数  
static long  getTotalRxBytes()  //获取设备总的接收字节数 
static long  getTotalTxBytes()  //获取设备总的发送字节数
static long  getUidRxBytes(int uid)  //获取指定uid的接收字节数  
static long  getUidTxBytes(int uid) //获取指定uid的发送字节数 

通过文档及上述函数可以知道,TrafficStats能够获取设备的数据流量和总的网络流量消耗(一般情况下也就得到Wi-Fi下的流量信息);可以查询uid对应的流量信息,而uid可以通过应用的包名查询到,因此能够查询某个应用的流量统计信息(不考虑shareuid)。非常方便的是,它的使用不需要特别的权限。另一方面它也一些限制:

(1)无法获取应用的数据流量消耗
从文档中仅能获取到指定uid的流量,但无法区分不同网络类型下的消耗
间接方法是通过监听网络切换,做好流量记录(但是要保证你的应用一直存活,且一定准确接收到网络切换信息),基本不可用。
(2)无法获取某个时间段内的流量消耗
从API文档中看,函数参数没有与时间相关的信息。而且重要的一点是,TrafficStats类中记录的是设备重启以来的流量统计信息。因为TrafficStats 类,底层还是读取/proc/net/xt_qtaguid/stats 对内容进行解析,将得到对应的结果返回上层。

链接:
Android应用流量统计——NetworkStatsManager使用

二、demo示例

本地使用demo验证流量消耗情况:获取一段时间内哪些应用进行了网络访问以及具体的流量消耗情况

package com.android.networktest;import android.app.AppOpsManager;
import android.app.usage.NetworkStats;
import android.app.usage.NetworkStatsManager;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.os.Build;
import android.os.Bundle;
import android.os.RemoteException;
import android.provider.Settings;
import android.util.Log;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);hasPermissionToReadNetworkStats();test();}private boolean hasPermissionToReadNetworkStats() {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {return true;}final AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,android.os.Process.myUid(), getPackageName());if (mode == AppOpsManager.MODE_ALLOWED) {return true;}requestReadNetworkStats();return false;}// 打开“有权查看使用情况的应用”页面private void requestReadNetworkStats() {Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);startActivity(intent);}public void test() {NetworkStatsManager networkStatsManager = (NetworkStatsManager) getSystemService(Context.NETWORK_STATS_SERVICE);long startTime = System.currentTimeMillis() - 1000 * 60 * 1000; // 从过去60x1000秒开始计算long endTime = System.currentTimeMillis();NetworkStats networkStats = null;NetworkStats.Bucket bucket = new NetworkStats.Bucket();try {networkStats = networkStatsManager.querySummary(ConnectivityManager.TYPE_WIFI,"",startTime,endTime);} catch (RemoteException e) {throw new RuntimeException(e);}networkStats.getNextBucket(bucket); // 获取第一个Bucketdo {// 获取应用程序UIDint uid = bucket.getUid();// 获取应用程序名称String packageName = getPackageManager().getNameForUid(uid);// 获取应用程序消耗的数据量long rxBytes = bucket.getRxBytes();long txBytes = bucket.getTxBytes();Log.d("henry------NetworkStats", "App: " + packageName + "  uid : " + uid +" RX bytes: " + rxBytes + ", TX bytes: " + txBytes);} while (networkStats.getNextBucket(bucket)); // 获取下一个Bucket,直到没有更多Bucket为止}
}

Manifest权限添加一下:

    <uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/>

LOG打印如下:
在这里插入图片描述
在这里插入图片描述

可以看到对应uid 所消耗的流量情况
但是uid为1000 即系统权限的应用有很多,无法进一步区分哪些系统应用默认进行了网络访问。

NetworkStatsManager底层调用的是如下节点的数据:可以看多最多细分只能划分到uid。
在这里插入图片描述
总结:
NetworkStatsManager主要用来获取三方应用用户自行下载的app流量所消耗的情况,对于系统权限uid,uid相同但非同一个应用的app或服务无法进一步区分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2979220.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringBoot】-MyBatis详解+单表操作

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Framework】 主要内容&#xff1a;什么是MyBatis框架&#xff1f;MyBatis框架有什么用&#xff1f;MyBatis实现查询步骤详解。MyBatis实现单表的增删查改。MyBatis模糊查询&…

TDSQL手动调整备份节点或冷备节点

一、背景描述 近期TDSQL数据库备份不稳定&#xff0c;有些set实例的备份任务未自动发起。经排查分析&#xff0c;存在多个set实例容量已经超过TB级别&#xff0c;且冷备节点都是同一台。因此&#xff0c;需要手动将当前备份节点改到其他备节点&#xff0c;开启增量备份&#x…

FLStudio怎么冻结轨道以及如何批量复制音符

FLStudio是一款功能强大的音乐制作软件&#xff0c;广泛用于音乐制作和打谱当中。我们在制作音乐时&#xff0c;经常会遇到处理大量音频轨道的情况&#xff0c;过多的音频轨道可能会导致电脑性能受限&#xff0c;从而影响工作流程。为了应对这个问题&#xff0c;FLStudio提供了…

CPPTest实例分析(C++ Test)

1 概述 CppTest是一个可移植、功能强大但简单的单元测试框架&#xff0c;用于处理C中的自动化测试。重点在于可用性和可扩展性。支持多种输出格式&#xff0c;并且可以轻松添加新的输出格式。 CppTest下载地址&#xff1a;下载地址1  下载地址2 下面结合实例分析下CppTest如…

小样本学习登Nature!计算效率高170倍,彻底起飞

中科院新提出的社会行为图谱SBeA登上Nature子刊&#xff01; SBeA是一个用于多动物3D姿势估计、身份识别和社会行为分类的小样本学习框架&#xff0c;能够全面量化自由群居动物的行为&#xff0c;使用较少的标记帧数&#xff08;约 400 帧&#xff09;进行多动物三维姿态估计。…

linux常用非基础命令/操作

本篇用于总结蒟蒻博主在使用linux系统的过程中会经常用到但老实记不住的一些非基础命令和操作&#xff0c;方便遗忘时查阅 一&#xff0c;关闭指定端口的进程以释放端口 每个端口都有一个守护进程&#xff0c;kill掉这个守护进程就可以释放端口 ①使用命令【netstat -anp | gre…

数据结构|树形结构|并查集

数据结构|并查集 并查集 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 有趣的并查集剧情演绎&#xff1a;【算法与数据结构】—— 并…

045、seq2seq

之——序列生成 杂谈 基于RNN实现&#xff0c;通过RNN生成器不断获取输入&#xff0c;更新隐藏状态&#xff0c;将最后生成的隐藏状态传递给解码器&#xff0c;然后自循环迭代直到输出停止。 正文 1.训练 训练时候解码器使用目标句子不断作为输入&#xff0c;就算解码错了输入…

linux休眠唤醒流程,及示例分析

休眠流程 应用层通过echo mem > /sys/power/state写入休眠状态&#xff0c;给一张大概流程图 这个操作对应在kernel/power/main.c的state这个attr的store操作 static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t n) …

ESP32-Thonny 拍摄图片到SD卡

前言&#xff1a; 代码运行在Thonny 添加main.py到单片机中&#xff1a; 可以先运行一下试试&#xff1a;会输出以下信息&#xff1a; 没有问题的话&#xff08;SD卡挂载成功&#xff0c;摄像头初始化成功&#xff09;运行一次主程序后&#xff0c;闪光灯会闪烁一下。 代码&…

js获取某月往前推一年或半年的年月数组

前言 需求&#xff1a;需要显示某月份往前推一年或者半年的费用情况&#xff0c;显示到柱形图上&#xff0c;后台接口只返回有数据的年份&#xff0c;这就需要前端拿全部月份数组去比对并显示。 开始 上代码&#xff1a; // date:选择的月份,比如:2024-04,//n:半年或者1年,…

PTA 天梯赛 L1-010 比较大小【C++】 L1-011 A-B 【C++ vector动态数组】【Python 字符串replace函数】

L1-010 比较大小 判断顺序很重要 #include<iostream> using namespace std; int main() {int a, b, c;cin >> a >> b >> c;int temp;if (a > b) {temp a;a b;b temp;}if (a > c) {temp a;a c;c temp;}if (b > c) {temp b;b c;c te…

C++ //练习 13.17 分别编写前三题中所描述的numbered和f,验证你是否正确预测了输出结果。

C Primer&#xff08;第5版&#xff09; 练习 13.17 练习 13.17 分别编写前三题中所描述的numbered和f&#xff0c;验证你是否正确预测了输出结果。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*************************…

【御控物联网平台】物联网平台常见通讯协议

随着物联网&#xff08;InternetofThings&#xff0c;IoT&#xff09;的快速发展&#xff0c;越来越多的设备和传感器连接到网络&#xff0c;使得数据的传递和交互变得更加智能化和高效化。在实现这种智能化和高效化的数据交互&#xff0c;过程中&#xff0c;各种不同的通信协议…

防火墙技术基础篇:什么是防火墙

防火墙技术基础篇&#xff1a;什么是防火墙 什么是防火墙&#xff1f; 在我们开始之前&#xff0c;让我们先想象一下一个真实的场景。你的家是你的私人领地&#xff0c;你不希望任何未经许可的人进入。为了保护你的家&#xff0c;你可能会安装一些安全设备&#xff0c;比如门…

webpack中mode、NODE_ENV、DefinePlugin、cross-env的使用

本文讲的全部知识点&#xff0c;都是和webpack相关的。如果你之前有疑问&#xff0c;那本文一定能帮你搞清楚。 问题来源一般是类似下面代码&#xff08;webpack.json中&#xff09;&#xff1a; "scripts": {"dev": "cross-env NODE_ENVdevelopmen…

Kafak详解(1)

简介 消息队列 为什么要有消息队列 图-1 消息队列的使用 消息队列 1)消息Message&#xff1a;网络中的两台计算机或者两个通讯设备之间传递的数据。例如说&#xff1a;文本、音乐、视频等内容。 2)队列Queue&#xff1a;一种特殊的线性表(数据元素首尾相接)&#xff0c;特…

DSView Windows平台编译

在Windows平台编译开源逻辑分析仪软件DSView&#xff0c;因官方没有公布DSView Windows平台源码&#xff0c;主要解决Windows平台以下问题&#xff1a; libusb_get_pollfds不支持Windows平台&#xff0c;导致无法采集数据插入设备后&#xff0c;无法自动识别设备&#xff0c;U…

全新创维EV6 Ⅱ超充车型有哪些亮点?答案将在北京车展揭晓

4月25日-5月4日&#xff0c;阔别4年的北京车展盛大回归&#xff0c;创维汽车将携全新车型创维EV6 Ⅱ超充车型及系列创新技术&#xff0c;亮相北京中国国际展览中心顺义馆W3号馆 311展位&#xff0c;全面展示其在新能源汽车补能及智能化领域的前瞻思考和技术布局。 以顶级超充革…

YOLOV5检测+追踪使用deepstream部署(c++版)

文章目录 一、Deepstream1.1 简介1.2 图架构&#xff08;Graph architecture&#xff09;1.3 应用架构&#xff08;Application Architecture&#xff09; 二、配置文件方式运行Deepstream2.1 环境准备2.2 主机运行2.3 配置文件解析2.4 docker运行 三、代码方式运行Deepstream3…