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,到此就应该能成功获取流量统计信息了
android 流量统计工具,Android 统计应用流量的使用情况相关推荐
- Android Gradle 构建工具(Android Gradle Build Tools)是什么?
转载地址:http://mrfu.me/android/2015/07/17/New_Android_Gradle_Build_Tools/ 译者地址:[翻]一览新的 Android Gradle 构 ...
- XCounter (源码统计工具 /代码统计工具)
XCounter (源码统计工具/代码统计工具) 支持统计语言: c语言.c++语言.c#语言.java语言和python语言 (后期版本将会加入其它相关语言) 目录 XCounter (源码统计工具 ...
- android app性能测试工具,Android 性能测试 - 内存
1.内存了解 在Android App的性能优化的各个部分里,内存方面的知识较多且不易理解,内存的问题绝对是最令人头疼的一部分,需要对内存基础知识.内存分配.内存管理机制等非常熟悉,才能排查题. 1. ...
- android 开发小工具,Android 开发者必备的八款小工具
在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一些Android 开发必备的小工具. Android Pixe ...
- 测试android兼容性测试工具,Android兼容性测试工具Spoon
android分布式测试工具. 简介 android众多的版本和机型给android app测试工作带来不小的挑战.Spoon通过将case分布式地执行.将执行结果更友好地展示出来,从而简化andro ...
- linux网络流量监测工具,linux下网络流量监控工具
今天QA同学让我协助检测下一台服务器的网络流量.没干过这活,在网上随便找了个命令.后来,发现是不对的,为了以后不出丑,决定收集下网络流量监测相关的工具. 查看某个网卡收发数据的总量 方法一 方法二 2 ...
- android 单位转换工具,Android单位转换工具类
Android单位转换工具类 Android单位转换工具类主要由以下4部分构成 1.这个类不能被初始化 2.dip转px接口 3.sp转px接口 4.px转dip接口 代码如下: import and ...
- android 新开发工具,Android开发人员必备的10个开发工具
Android SDK 本身包含很多帮助开发人员设计.开发.测试和发布 Android 应用的工具,在本文中,我们将讨论 10 个最常用的工具. 1. Eclipse ADT Eclipse ADT ...
- 【工具】一款在线字数统计工具,统计单个字词组出现的频率
一款在线文字字数统计工具,可以算出一篇文章中,文字或者词组出现的次数频率,并做了排序处理,支持中文和英文两种语言. 与网上的仅中文多少字.英文多少字.符号多少字,分别算一个总数出来不一样的,这个工具是 ...
最新文章
- ACL 2020 | 用于多领域端到端任务型对话系统的动态融合网络
- boost::remove_copy相关的测试程序
- 2.4.5 MySQL InnoDB重做与回滚介绍
- gcc 5.2.0 手动更新(亲测)
- 【Web后端笔记】SQL Server与java数据类型对应
- python compare excel_python简单操作excle的方法
- Windows Phone 8安装包中的文件和独立存储区中的文件访问
- 【转载】这次拆库 应是微服务化的拆分方式
- android 生命周期流程图,Android Studio ——Service的生命周期
- 鼠标样式css设置 cursor
- 蓝桥杯2018年第九届C/C++省赛B组第三题-乘积尾零
- 对极大似然估计的理解
- 大数据学习笔记3 - 并行编程模型MapReduce
- ASM 转自三思笔记,改成自己看着舒服的格式而已
- SQL Server报表——小白开发笔记
- mysql 32位_MySQL8下载 MySQL 8 for windows 32位 v8.0.18 官方免费正式版 下载-脚本之家
- 第一批阳了的中年人:卷不赢,躺不平,摆不烂
- pixfllow光流传感器数据获取及悬停程序编写
- [NCTF 2018]签到题
- 会声会影x4素材_会声会影2020旗舰版Corel VideoStudio Ultimate 2020中文版
热门文章
- java 网页正文抽取算法_网页正文抽取算法 ContentExtractor
- python实现栈的操作入站出站查找元素等_Python实现的栈(Stack)
- python字符串为什么不能修改_为什么在Python(\n)中更改字符串中的行不起作用?...
- python计算precision,recall,f1-score
- 积分图像(Integral image)
- Python Cookbook 3rd Edition Documentation
- Libcurl安装与HelloWorld
- 安卓逆向_1 --- 逆向环境配置、APK 文件结构、APK 打包流程
- Java并发编程实战~生产者-消费者模式
- jsp 页面获取action 属性的方法