android 流量统计工具,Android 统计应用流量的使用情况

Android 获取应用流量的使用情况有两种方法

TrafficStats

NetworkStatsManager 是Android 6.0(API23)中新增加的类

这次我们使用的是第二种方法,记录一下实现过程

首先说明NetworkStatsManager能提供哪些功能

区分 Wifi 和手机网络的流量使用

查询指定应用的流量使用

查询指定时间段的流量使用(当天/当月/总共)

区分接收和发送的流量使用

看下方法使用代码

/**

* 本机使用的 wifi 总流量

*/

public long getAllBytesWifi() {

NetworkStats.Bucket bucket;

try {

bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI,

"",

0,

System.currentTimeMillis());

} catch (RemoteException e) {

return -1;

}

//这里可以区分发送和接收

return bucket.getTxBytes() +bucket.getRxBytes() ;

}

/**

* 本机使用的 mobile 总流量

*/

public long getAllBytesMobile() {

NetworkStats.Bucket bucket;

try {

bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE,

getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),

0,

System.currentTimeMillis());

} catch (RemoteException e) {

return -1;

}

//这里可以区分发送和接收

return bucket.getTxBytes() +bucket.getRxBytes() ;

}

private String getSubscriberId(Context context, int networkType) {

if (ConnectivityManager.TYPE_MOBILE == networkType) {

TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

return tm.getSubscriberId();

}

return "";

}

/**

* 获取指定应用 wifi 发送的当天总流量

* @param packageUid 应用的uid

* @return

*/

public long getPackageTxDayBytesWifi(int packageUid) {

NetworkStats networkStats = null;

try {

networkStats = networkStatsManager.queryDetailsForUid(

ConnectivityManager.TYPE_WIFI,

"",

getTimesmorning(),

System.currentTimeMillis(),

packageUid);

} catch (RemoteException e) {

return -1;

}

NetworkStats.Bucket bucket = new NetworkStats.Bucket();

networkStats.getNextBucket(bucket);

return bucket.getTxBytes();

}

/**

* 获取当天的零点时间

*

* @return

*/

public static long getTimesmorning() {

Calendar cal = Calendar.getInstance();

cal.set(Calendar.HOUR_OF_DAY, 0);

cal.set(Calendar.SECOND, 0);

cal.set(Calendar.MINUTE, 0);

cal.set(Calendar.MILLISECOND, 0);

return (cal.getTimeInMillis());

}

//获得本月第一天0点时间

public static int getTimesMonthmorning() {

Calendar cal = Calendar.getInstance();

cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);

cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));

return (int) (cal.getTimeInMillis());

}

/**

* 根据包名获取uid

* @param context 上下文

* @param packageName 包名

*/

public static int getUidByPackageName(Context context, String packageName) {

int uid = -1;

PackageManager packageManager = context.getPackageManager();

try {

PackageInfo packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_META_DATA);

uid = packageInfo.applicationInfo.uid;

} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

}

return uid;

}

调用过程

//以上的方法封装在了NetworkStatsHelper类里

public class NetworkStatsHelper {

NetworkStatsManager networkStatsManager;

int packageUid;

public NetworkStatsHelper(NetworkStatsManager networkStatsManager) {

this.networkStatsManager = networkStatsManager;

}

}

//初始化这个工具类

NetworkStatsManager networkStatsManager = (NetworkStatsManager) getSystemService(NETWORK_STATS_SERVICE);

helper = new NetworkStatsHelper(networkStatsManager);

循环遍历应用

PackageManager packageManager = getPackageManager();

final List applicationInfoList = packageManager.getInstalledPackages(0);

for (PackageInfo info : applicationInfoList) {

try {

PackageInfo pack = packageManager.getPackageInfo(info.packageName,PackageManager.GET_PERMISSIONS);

String[] requestedPermissions = pack.requestedPermissions;

if (requestedPermissions == null)

continue;

if (info.applicationInfo.uid == 1000)

continue;

for (String str : requestedPermissions) {

if (str.equals("android.permission.INTERNET")) {

long mobileTodayRx = helper.getPackageDayRxBytesMobile(mContext, uid);

//...添加自己的代码

break;

}

}

} catch (PackageManager.NameNotFoundException exception) {

exception.printStackTrace();

}

}

这里说明下为什么要过滤掉info.applicationInfo.uid == 1000

因为没有获取uid == 1000的进程的流量权限

好了现在说到权限,下面就是需要配置的权限

其中tools:ignore 就是忽略这个错误的意思,不然它会报红

仅仅在manifest里配置权限还是不够的,还要动态申请

private boolean hasPermissionToReadNetworkStats() {

int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);

if (permissionCheck != PackageManager.PERMISSION_GRANTED) {

ActivityCompat.requestPermissions(this,

new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE);

} else {

}

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);

}

OK,到此就应该能成功获取流量统计信息了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平台型时间信号强度曲线_哥测的不是BET,是氮气等温吸脱附曲线

平时经常会说去测个BET&#xff0c;看看材料比表面积多大&#xff0c;孔径分布如何&#xff0c;其实我们测试的并不是BET&#xff0c;而是氮气等温吸脱附曲线&#xff0c;测试得到的数据是氮气等温吸脱附曲线&#xff0c;比表面积、孔径分布都是通过公式计算得到的。所以本文旨…

python整数类型在每一台计算机上的取值范围是一样的_人工智能第一章:Python语言基础...

1 Python简介 Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言&#xff0c;最初被设计用于编写自动化脚本(shell)&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越来越多被用于独立的、大型项目的开发。 1.1 起源 Python的作者是著名的…

android震动服务能设置时长么,Android实现手机振动设置的方法

本文实例讲述了Android实现手机振动设置的方法。分享给大家供大家参考。具体如下&#xff1a;main.xml布局文件&#xff1a;android:orientation"vertical" android:layout_width"fill_parent"android:layout_height"fill_parent">android:la…

lua正则替换_lua 字符串 正则表达式 转义 特殊字符

string.gsub 函数有三个参数:目标串,模式串,替换串。 基本作用是用来查找匹配模式的串,并将使用替换串其替换掉: s = string.gsub("Lua is good", "good", "bad?") print(s) --> Lua is bad string.gsub 的第二个返回值表示进行替换操…

请概述可视化卷积神经网络的中间输出的基本思想。_最详细的卷积神经网络入门指南!...

编辑&#xff1a;murufengDate&#xff1a;2020-05-15来源&#xff1a;深度学习技术前沿微信公众号链接&#xff1a;干货|最全面的卷积神经网络入门教程卷积神经网络简介卷积网络 (convolutional network)(LeCun, 1989)&#xff0c;也叫做卷积神经网络 (convolutional neural n…

java类与对象实验报告心得体会_Java类与对象实验报告.doc

西 安 邮 电 大 学(计算机学院)课内实验报告实验名称&#xff1a; 类与对象专业名称&#xff1a; 计算机科学与技术班 级&#xff1a; 计科1405班学生姓名&#xff1a; 高宏伟学 号&#xff1a; 指导教师&#xff1a; 刘霞林实验日期&#xff1a; 2016.9.29一、实验目的通过编程…

linux date fmt,date_format(date,frm) 详解

DATE_FORMAT(date,format)Formats the datevalue according tothe format string.The following specifiers may be used in theformat string. The“%”character is requiredbefore format specifier characters.SpecifierDescription%aAbbreviated weekday name(Sun..Sat)%b…

python numpy和pandas库的区别_python – 来自熊猫和numpy的意思不同

简洁版本&#xff1a; 之所以不同,是因为在调用平均操作时,pandas会使用瓶颈(如果已安装),而不是仅仅依赖于numpy.据推测,瓶颈似乎比numpy更快(至少在我的机器上),但代价是精确度.它们碰巧匹配64位版本,但32位不同(这是有趣的部分). 长版&#xff1a; 通过检查这些模块的源代码…

python实现数据恢复软件_pyinstaller还原python代码过程图解

这篇文章主要介绍了pyinstaller还原python代码过程图解,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下pyinstaller 的作用就是将python打包成对应平台的可执行文件。一般这种可执行文件的体积都比较大。我们可以…

android 截图 listview,Android屏幕及view的截图实例详解

Android屏幕及view的截图实例详解屏幕可见区域的截图整个屏幕截图的话可以用View view getWindow().getDecorView();public static Bitmap getNormalViewScreenshot(View view) {view.setDrawingCacheEnabled(true);view.buildDrawingCache();return view.getDrawingCache();}…

python指定位置写入文件_Python从文件中读取指定的行以及在文件指定位置写入

Python从文件中读取指定的行以及在文件指定位置写入 Python从文件中读取指定的行 如果想根据给出的行号&#xff0c; 从文本文件中读取一行数据&#xff0c; Python标准库linecache模块非常适合这个任务: 测试文件内容 &#xff1a; This is line 1. This is line 2. This is l…

华硕 x86 android,【华硕X79评测】学不会不收费 几步教你安装Android x86-中关村在线...

安装Android x86其实并不困难【中关村在线】华硕X79评测&#xff1a; 话说最近操作系统这个话题非常火爆。也许是借助于Windows 8消费者预览版的光芒&#xff0c;凡是与系统搭边的东西大家好像都喜欢与Windows 8进行比较。介于现在可以使用的系统众多&#xff0c;其中Android x…

r矢量球坐标系旋度_矢量与场论 | 场论

场的概念 | 方向导数与梯度 | 通量与散度 | 环量与旋度 | 典型矢量场 | 哈密顿算子场的概念1.场&#xff1a;如果在全部空间或部分空间里的每一点&#xff0c;都对应着某个物理量的一个确定的值&#xff0c;即在这个空间里确定了该物理量的一个场。&#xff08;数量场/矢量场 、…

springboot用户管理系统_Springboot优秀开源项目

前言 作为一个开发人员来说,快速的熟悉一项技术就是去使用它.伟大的作家鲁迅先生曾说过:看别人视频不如自己敲代码!作为一个菜鸡开发,我平时也致力于收集各种大神的开源项目!接下来就给大家带来我绞尽乳汁为大家搜罗的几个开源的好项目吧!1. 基于springboot Vue 的人事管理系统…

转换背景色 html,html – CSS转换:淡化背景颜色,重置后

我有一个div列表&#xff0c;并允许我的用户通过发布新的内容动态添加一个新的。如果用户发布新内容&#xff0c;我想通过将新div的背景颜色淡化为另一种颜色&#xff0c;并将其淡出&#xff0c;从而在屏幕上突出显示。我很亲近我正在使用这个CSS来触发转换&#xff1a;.backgr…

第一次失效_又到审核季,内审员们,咱如何开好第一次会议?

导读作为一名企业的内审员&#xff0c;展开工作将从第一次会议开始&#xff0c;那么如何组织好第一次会议将是十分关键的&#xff0c;今天小编特地跟大家一起分享下首次会议召开的案例&#xff0c;手把手教你怎么成功召开首次会议&#xff1a;首次会议由审核组长主持。01 签到与…

python判断字符_Python判断字符串是否为字母或者数字(浮点数)

str为字符串s为字符串 str.isalnum() 所有字符都是数字或者字母 str.isalpha() 所有字符都是字母 str.isdigit() 所有字符都是数字 str.isspace() 所有字符都是空白字符、t、n、r 检查字符串是数字/浮点数方法 float部分 >> float(Nan) nan >> float(Nan) nan >…

疯狂动物消消乐html5游戏在线玩,疯狂动物消消乐免费

疯狂动物消消乐免费版这是一个移动端休闲益智手游&#xff0c;疯狂动物消消乐免费版主打消除了玩法&#xff0c;在疯狂动物消消乐免费版游戏当中玩家要经过种种形式移动游戏当中元素来到达相同种类消除了成功的目的。游戏介绍疯狂动物消消乐一款休闲类的消除游戏&#xff0c;全…

windows便签快捷键_win10电脑有哪些常用的快捷键?

十年八年都不怎么用的快捷键这里就不讲啦&#xff0c;全是常用的&#xff0c;而且用熟了之后你的电脑水平就会变高&#xff0c;至少别人看来是这样的啦♪(^∇^*)。windows键P键&#xff1a;打开小娜&#xff0c;可搜问题&#xff0c;可聊天&#xff0c;可语音调戏。小娜windows…

四川计算机专业大专哪所好,四川省计算机多媒体技术好的大专学校哪好

四川省计算机多媒体技术好的大专学校哪好?随着计算机多媒体技术越来越深入的与人们的生活联系在一起&#xff0c;开设计算机多媒体技术专业的学校也是越来越多&#xff0c;报考计算机多媒体技术专业的同学也是一年比一年多&#xff0c;可是计算机多媒体技术好的大专学校有哪些…