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 统计应用流量的使用情况相关推荐

  1. Android Gradle 构建工具(Android Gradle Build Tools)是什么?

    转载地址:http://mrfu.me/android/2015/07/17/New_Android_Gradle_Build_Tools/ 译者地址:[翻]一览新的 Android Gradle 构 ...

  2. XCounter (源码统计工具 /代码统计工具)

    XCounter (源码统计工具/代码统计工具) 支持统计语言: c语言.c++语言.c#语言.java语言和python语言 (后期版本将会加入其它相关语言) 目录 XCounter (源码统计工具 ...

  3. android app性能测试工具,Android 性能测试 - 内存

    1.内存了解 在Android App的性能优化的各个部分里,内存方面的知识较多且不易理解,内存的问题绝对是最令人头疼的一部分,需要对内存基础知识.内存分配.内存管理机制等非常熟悉,才能排查题. 1. ...

  4. android 开发小工具,Android 开发者必备的八款小工具

    在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一些Android 开发必备的小工具. Android Pixe ...

  5. 测试android兼容性测试工具,Android兼容性测试工具Spoon

    android分布式测试工具. 简介 android众多的版本和机型给android app测试工作带来不小的挑战.Spoon通过将case分布式地执行.将执行结果更友好地展示出来,从而简化andro ...

  6. linux网络流量监测工具,linux下网络流量监控工具

    今天QA同学让我协助检测下一台服务器的网络流量.没干过这活,在网上随便找了个命令.后来,发现是不对的,为了以后不出丑,决定收集下网络流量监测相关的工具. 查看某个网卡收发数据的总量 方法一 方法二 2 ...

  7. android 单位转换工具,Android单位转换工具类

    Android单位转换工具类 Android单位转换工具类主要由以下4部分构成 1.这个类不能被初始化 2.dip转px接口 3.sp转px接口 4.px转dip接口 代码如下: import and ...

  8. android 新开发工具,Android开发人员必备的10个开发工具

    Android SDK 本身包含很多帮助开发人员设计.开发.测试和发布 Android 应用的工具,在本文中,我们将讨论 10 个最常用的工具. 1. Eclipse ADT Eclipse ADT  ...

  9. 【工具】一款在线字数统计工具,统计单个字词组出现的频率

    一款在线文字字数统计工具,可以算出一篇文章中,文字或者词组出现的次数频率,并做了排序处理,支持中文和英文两种语言. 与网上的仅中文多少字.英文多少字.符号多少字,分别算一个总数出来不一样的,这个工具是 ...

最新文章

  1. ACL 2020 | 用于多领域端到端任务型对话系统的动态融合网络
  2. boost::remove_copy相关的测试程序
  3. 2.4.5 MySQL InnoDB重做与回滚介绍
  4. gcc 5.2.0 手动更新(亲测)
  5. 【Web后端笔记】SQL Server与java数据类型对应
  6. python compare excel_python简单操作excle的方法
  7. Windows Phone 8安装包中的文件和独立存储区中的文件访问
  8. 【转载】这次拆库 应是微服务化的拆分方式
  9. android 生命周期流程图,Android Studio ——Service的生命周期
  10. 鼠标样式css设置 cursor
  11. 蓝桥杯2018年第九届C/C++省赛B组第三题-乘积尾零
  12. 对极大似然估计的理解
  13. 大数据学习笔记3 - 并行编程模型MapReduce
  14. ASM 转自三思笔记,改成自己看着舒服的格式而已
  15. SQL Server报表——小白开发笔记
  16. mysql 32位_MySQL8下载 MySQL 8 for windows 32位 v8.0.18 官方免费正式版 下载-脚本之家
  17. 第一批阳了的中年人:卷不赢,躺不平,摆不烂
  18. pixfllow光流传感器数据获取及悬停程序编写
  19. [NCTF 2018]签到题
  20. 会声会影x4素材_会声会影2020旗舰版Corel VideoStudio Ultimate 2020中文版

热门文章

  1. java 网页正文抽取算法_网页正文抽取算法 ContentExtractor
  2. python实现栈的操作入站出站查找元素等_Python实现的栈(Stack)
  3. python字符串为什么不能修改_为什么在Python(\n)中更改字符串中的行不起作用?...
  4. python计算precision,recall,f1-score
  5. 积分图像(Integral image)
  6. Python Cookbook 3rd Edition Documentation
  7. Libcurl安装与HelloWorld
  8. 安卓逆向_1 --- 逆向环境配置、APK 文件结构、APK 打包流程
  9. Java并发编程实战~生产者-消费者模式
  10. jsp 页面获取action 属性的方法