手机流量的统计

流量统计原理:  在模拟器上是看不到效果的
/*
通过adb命令查看流量的使用情况:
    adb -s 手机名  shell (当有多个设备连接的时候,可以这样选择)
    ls  (可以查看当前设备的所有文件夹    ls -l 详细信息)
    cd proc      (proc文件夹为手机的一些配置信息)
    cat cpuinfo     (查看手机cpu信息)
    cd uid_stat    (ls一下就可以看到这个文件夹下有很多文件夹,uid_stat里面装的所有软件的id名称,每个id名称为一个文件夹,文件夹里面装的该软件接收与发送的流量字节数)
注意:该文件夹里的数据是实时更新的,如果关机了,这里的数据就会清零,重新开始计数
*/

所以如果想计算流量比较精确,就需要隔几分钟就去查询一次,尽可能的避免关机带来的误差

所以可以这样获取: 该代码前面部分来至:获取手机中所有应用信息,listView复用,为listView插入不同的item,根据包名开启该应用

/**
     * 获取安装在该手机的所有app所使用的流量大小
     */
    public void getAppInfos(Context context){
        //获取应用管理者
        PackageManager pm = context.getPackageManager();
        //所有安装在手机上的应用程序包信息
        List<PackageInfo> packInfos = pm.getInstalledPackages(0);
        for (PackageInfo packInfo : packInfos) {
            //packageInfo 相当于一个应用程序apk包的清单文件
            String packname=packInfo.packageName;//获取应用包名
            //packInfo.applicationInfo相当于清单文件中的application
            Drawable icon = packInfo.applicationInfo.loadIcon(pm);//获取应用图标
            String name = packInfo.applicationInfo.loadLabel(pm).toString();//应用名称
//获取系统分配给该软件固定的id编号 int uid=packInfo.applicationInfo.uid; //通过id编号获取该软件使用的流量数据 File revfile = new File("/proc/uid_stat/"+uid+"/tcp_rcv");//接收的流量字节数 File sendfile = new File("/proc/uid_stat/"+uid+"/tcp_snd");//发送的流量字节数 //然后读数据就行, 里面的数据就是一行数字 } }

 由于谷歌知道需要频繁的获取流量的数据大小,所以从2.3开始就封装了api来得到手机流量的统计信息,如下:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.获取一个包管理器
        PackageManager pm = getPackageManager();
        //2.便利手机,获取所有的应用程序的uid
        List<ApplicationInfo> applicationInfos = pm.getInstalledApplications(0);
        for (ApplicationInfo applicationInfo : applicationInfos) {
            int uid = applicationInfo.uid;
            //记录流量的文件位置: /proc/uid_stat/id编号
            long tx = TrafficStats.getUidTxBytes(uid);//上传的流量 byte
            long rx = TrafficStats.getUidRxBytes(uid);//下载的流量 byte
            //上面方法返回-1 代表的是该应用没有产生流量,或者安卓系统不支持流量统计
        }
        TrafficStats.getMobileTxBytes();//获取手机3g/2g网络上传的总流量
        TrafficStats.getMobileRxBytes();//获取手机3g/2g网络下载的总流量
        
        TrafficStats.getTotalTxBytes();//手机全部网络接口 包括wifi,3g,2g上传的总流量
        TrafficStats.getTotalRxBytes();//手机全部网络接口 包括wifi,3g,2g下载的总流量
    }

 

posted @ 2016-09-07 19:42  ts-android  阅读(850)  评论(0编辑  收藏  举报