`
yangguangfu
  • 浏览: 1539721 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

读取android手机流量信息

阅读更多

 

本文来自 CSDN 博客,转载请标明出处: http://blog.csdn.net/Zengyangtech/archive/2010/05/04/5554940.aspx

 

android手机流量信息系统是LINUX内核 记录在/proc/self/net/dev文件里面 

我们可以看看dev文件的格式

Microsoft Windows XP [版本 5.1.2600]

(C) 版权所有 1985-2001 Microsoft Corp.

D:\Program Files\Java\sdk\android-sdk-windows\tools>adb shell

# cd proc

cd proc

# cd net

cd net

# cat dev

cat dev

Inter-|   Receive                                                |  Transmit

 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packe

ts errs drop fifo colls carrier compressed

    lo:       0       0    0    0    0     0          0         0        0

 0    0    0    0     0       0          0

  eth0: 7069733   86239    0    0    0     0          0         0 12512463   741

79    0    0    0     0       0          0

 tunl0:       0       0    0    0    0     0          0         0        0

 0    0    0    0     0       0          0

  gre0:       0       0    0    0    0     0          0         0        0

 0    0    0    0     0       0          0

#

我们要获取流量可以通过这个文件进行读取

我读取的源代码如下

package zy.dnh;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.FileReader;

import java.io.IOException;

import java.util.Calendar;

import org.apache.http.util.EncodingUtils;

import android.app.Service;

import android.content.Intent;

import android.os.Handler;

import android.os.IBinder;

import android.widget.Toast;

/*  */

public class mService1 extends Service

{

    private Handler objHandler = new Handler();

    private int intCounter=0;

    private int mHour; 

private int mMinute; 

private int mYear; 

private int mMonth; 

private int mDay;

private String mdate;

final public String DEV_FILE = "/proc/self/net/dev";//系统流量文件

String[] ethdata={"0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"};

String[] gprsdata={"0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"};

String[] wifidata={"0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"};

String data="0,0,0,0,0,0,0,0,0,0,0,0";//对应on.txt里面的格式

final String ETHLINE="  eth0";//eth是以太网信息 tiwlan0 是 Wifi  rmnet0 是 GPRS

final String GPRSLINE="rmnet0";

final String WIFILINE="tiwlan0";

final String TEXT_ENCODING = "UTF-8";

 

final public String ONPATH = "/data/data/zy.dnh/on.txt";

final public String LOGPATH = "/data/data/zy.dnh/log.txt";

    private Runnable mTasks = new Runnable() 

    {

        public void run()//运行该服务执行此函数

        {

      refresh();

    

    

          intCounter++;

         //DisplayToast("Counter:"+Integer.toString(intCounter));

         objHandler.postDelayed(mTasks, 3000);//每3000毫秒执行一次

       } 

    };

  @Override

  public void onStart(Intent intent, int startId)

  {

    // TODO Auto-generated method stub

 

    objHandler.postDelayed(mTasks, 0);

    super.onStart(intent, startId);

  }

  @Override

  public void onCreate()

  {

    // TODO Auto-generated method stub

 

    super.onCreate();

  }

  @Override

  public IBinder onBind(Intent intent)

  {

    // TODO Auto-generated method stub

    return null;

  }

  @Override

  public void onDestroy()

  {

    // TODO Auto-generated method stub

    /*  */

    objHandler.removeCallbacks(mTasks);

    super.onDestroy();

  }  

  public void DisplayToast(String str)

  {

   Toast.makeText(this,str,Toast.LENGTH_SHORT).show();

  }  

  public void readdev()

  {

 FileReader fstream = null;

   try {

          fstream = new FileReader(DEV_FILE);

          } 

     catch (FileNotFoundException e) {

      DisplayToast("Could not read " + DEV_FILE);

        }

       BufferedReader in = new BufferedReader(fstream, 500);

       String line;

       String[] segs;

       String[] netdata;

       int count=0;

       int k;

       int j;

       try {

          while ((line = in.readLine()) != null) {

          segs = line.trim().split(":");

          if(line.startsWith(ETHLINE))

            {

              

              netdata=segs[1].trim().split(" ");

              for(k=0,j=0;k<netdata.length;k++)

              {

             if(netdata[k].length()>0) 

            

                  ethdata[j]=netdata[k];

                  j++;

             }

              }

              }

          else if(line.startsWith(GPRSLINE))

          {

          

         netdata=segs[1].trim().split(" ");

            for(k=0,j=0;k<netdata.length;k++)

            {

           if(netdata[k].length()>0) 

          

                gprsdata[j]=netdata[k];

                j++;

           }

            }

          }

         else if(line.startsWith(WIFILINE))

        {

        

       netdata=segs[1].trim().split(" ");

            for(k=0,j=0;k<netdata.length;k++)

            {

            if(netdata[k].length()>0) 

            { 

              wifidata[j]=netdata[k];

              j++;

            }

            }

        }

              count++;

          }

          fstream.close();

        } 

        catch (IOException e) {

          DisplayToast(e.toString());

        }

  }

  public String getinfo(String path)

  {

   File file;

   String str=""; 

   FileInputStream in;

   try{

   //打开文件file的InputStream

   file = new File(path);

       in = new FileInputStream(file);

       //将文件内容全部读入到byte数组

       int length = (int)file.length();

       byte[] temp = new byte[length];

       in.read(temp, 0, length);

       //将byte数组用UTF-8编码并存入display字符串中

       str =  EncodingUtils.getString(temp,TEXT_ENCODING);

       //关闭文件file的InputStream

       in.close();

   }

   catch (IOException e) {

   DisplayToast(e.toString());

   }

    return str;

  }

  public void writefile(String str,String path )

  {

   File file;

   FileOutputStream out;

   try {

           //创建文件

   file = new File(path);

           file.createNewFile();

           //打开文件file的OutputStream

           out = new FileOutputStream(file);

           String infoToWrite = str;

           //将字符串转换成byte数组写入文件

           out.write(infoToWrite.getBytes());

           //关闭文件file的OutputStream

           out.close(); 

       } catch (IOException e) {

           //将出错信息打印到Logcat

      DisplayToast(e.toString());

       }

  }

  public void refresh()

  {

 

 

 readdev();//读取本次开机之后直到当前系统的总流量

 

  data=ethdata[0]+","+ethdata[1]+","+ethdata[8]+","+ethdata[9]+","

      +gprsdata[0]+","+gprsdata[1]+","+gprsdata[8]+","+gprsdata[9]+","

      +wifidata[0]+","+wifidata[1]+","+wifidata[8]+","+wifidata[9];

 String onstr=getinfo(ONPATH);//读取on.txt记录到onstr里

  String ondata[]=onstr.split(",");//将onstr各项分离 放到ondata里

 //计算增量

 int [] delta=new int [12];

 

 delta[0]=Integer.parseInt(ethdata[0])-Integer.parseInt(ondata[0]);

 delta[1]=Integer.parseInt(ethdata[1])-Integer.parseInt(ondata[1]);

 delta[2]=Integer.parseInt(ethdata[8])-Integer.parseInt(ondata[2]);

 delta[3]=Integer.parseInt(ethdata[9])-Integer.parseInt(ondata[3]);

 delta[4]=Integer.parseInt(gprsdata[0])-Integer.parseInt(ondata[4]);

 delta[5]=Integer.parseInt(gprsdata[1])-Integer.parseInt(ondata[5]);

 delta[6]=Integer.parseInt(gprsdata[8])-Integer.parseInt(ondata[6]);

 delta[7]=Integer.parseInt(gprsdata[9])-Integer.parseInt(ondata[7]);

 delta[8]=Integer.parseInt(wifidata[0])-Integer.parseInt(ondata[8]);

 delta[9]=Integer.parseInt(wifidata[1])-Integer.parseInt(ondata[9]);

 delta[10]=Integer.parseInt(wifidata[8])-Integer.parseInt(ondata[10]);

 delta[11]=Integer.parseInt(wifidata[9])-Integer.parseInt(ondata[11]);

 

 

 //读取log.txt

//获取当前时间

  final Calendar c = Calendar.getInstance(); 

      mYear = c.get(Calendar.YEAR); //获取当前年份 

      mMonth = c.get(Calendar.MONTH)+1;//获取当前月份 

      mDay = c.get(Calendar.DAY_OF_MONTH);//获取当前月份的日期号码 

      mHour = c.get(Calendar.HOUR_OF_DAY);//获取当前的小时数 

      mMinute = c.get(Calendar.MINUTE);//获取当前的分钟数   

      mdate=mYear+"-"+mMonth+"-"+mDay;

 String text=getinfo(LOGPATH);//将log.txt的内容读到text字符串中

 String [] line=text.split("\n"); 

 

 String today=line[line.length-1];//获得今日已记录流量

 String [] beToday=today.split(","); 

//检查文件最后一行是否为今天的流量记录信息

 if(!beToday[0].equals(mdate))//如果文件只有一行,表明目前日志为空,将当前日期加入

//判断今日流量是否已经记录,如果今日流量没有记录

 {

 

 text=text+mdate+",0,0,0,0,0,0,0,0,0,0,0,0\n";

 writefile(text,LOGPATH);

 

 

 line=text.split("\n");

 today=line[line.length-1];//获得今日已记录流量

 

 beToday=today.split(","); 

 }

 

 

 

 int i;

 

 //处理今日流量

 int [] newTodaydata=new int [12];//表示今日流量

 String newtoday=mdate;

 for(i=0;i<=11;i++)

 {

 newTodaydata[i]=Integer.parseInt(beToday[i+1])+delta[i];

 newtoday=newtoday+","+newTodaydata[i];

 }

 newtoday=newtoday+"\n";

 

 

 String [] beTotal=line[0].split(",");

 int [] newTotaldata=new int [12];//表示总流量数值

 //更新第一行

 String newtotal="total";

 for(i=0;i<=11;i++)

 {  

 newTotaldata[i]=Integer.parseInt(beTotal[i+1])+delta[i];//总流量数 值+delta[i]更新

     newtotal=newtotal+","+newTotaldata[i];

 }

 newtotal= newtotal+"\n";

 //处理中间不变的部分

 String before="";//before为之前的从第1行到昨天的流量记录

 

 for(i=1;i<=line.length-2;i++)

   before=before+line[i]+"\n";//代表中间不变的部分

 

 String newlog=newtotal+before+newtoday;

 

 

 

 writefile(data,ONPATH);//更新流量记录

 writefile(newlog,LOGPATH);//更新log*/

 

 

 

  }

}

分享到:
评论

相关推荐

    Android手机流量控制源码

    总的来说,这个"Android手机流量控制源码"项目为开发者提供了一套工具,可以用来监控和控制Android应用的网络流量,包括获取流量统计、设置流量限制和提醒等功能。通过深入研究这些源码,开发者不仅可以学习到如何在...

    Android手机流量观测客户端

    在Android平台上,开发一款手机流量观测客户端涉及到多个...综上所述,开发一个Android手机流量观测客户端是一个涉及多方面技术的综合工程,需要对Android系统有深入理解,同时具备良好的用户界面设计和数据处理能力。

    android开发手机流量监控

    2. **获取流量信息**:在BroadcastReceiver的onReceive()方法中,调用TrafficStats的统计方法,获取当前的流量数据。 3. **数据计算与展示**:将获取到的流量数据转换成可读性强的格式(如MB或GB),并展示在应用的...

    Android App流量统计源码

    在Android系统中,我们可以利用`ConnectivityManager`和`TrafficStats`类来获取网络流量信息。`ConnectivityManager`用于监控网络连接状态,而`TrafficStats`则提供了统计移动网络和WiFi数据流量的方法。通过调用`...

    Android手机流量电量监控程序

    以下是对这个"Android手机流量电量监控程序"源码的详细分析和相关知识点讲解。 首先,我们要了解Android系统架构,它是基于Linux内核的,允许开发者通过Java语言编写应用程序。在Android中,我们可以利用系统的API...

    Android获取指定应用,单独应用的流量统计

    总之,获取Android应用的流量统计需要理解系统底层的工作原理,合理使用权限,正确处理网络状态变化,并适配不同的Android版本。通过以上步骤,你将能够有效地统计指定应用在WiFi和GPRS网络下的数据流量。

    Android获取手机号码

    在讲解如何获取手机号码之前,我们需要理解Android权限系统以及相关的API。 首先,要获取到用户的手机号码,你的应用程序需要在`AndroidManifest.xml`文件中声明`READ_PHONE_STATE`权限: ```xml ...

    Android 应用流量统计 NetworkStatsManage

    1.Android官方6.0之后推出的API网络太类 NetworkStatsManager 介绍 2.统计查询方法(UID单个应用,所有应用) 3.统计过程中的发现的坑以及解决方案 4.博客:北极的松树

    Android_获取进程的上下行流量

    通过以上步骤,开发者能够准确地获取 Android 设备上特定进程的上下行流量信息。这对于开发需要监控网络使用的应用程序尤其有用。同时,了解这些 API 的限制和适用范围也是十分重要的,因为并非所有的设备都能够提供...

    移动android手机查话费流量

    移动通信卡的android手机查话费,流量,短信。

    Android项目实战--手机卫士34--流量管理

    在Android平台上,开发一款手机卫士应用涉及到许多技术点,特别是流量管理功能是现代移动设备用户非常关注的一个特性。在“Android项目实战--手机卫士34--流量管理”中,我们将深入探讨如何构建这样的功能,帮助用户...

    基于Android平台的手机流量实时监控技术的研究与实现.pdf

    然后,文中讨论了当前Android手机流量监控功能的不足之处,提出了基于Android平台的手机流量实时监控技术的研究目标。 在技术实现方面,本文提出了一个基于Android平台的手机流量实时监控技术架构,该架构通过调用 ...

    Android应用源码可以按时间段查询的流量统计项目

    应用根据用户的选择从存储的数据中读取相应的流量信息,然后计算出这段时间内的总上传和下载流量。这些数据显示在界面上,以便用户了解自己的流量使用情况。 在实际开发中,我们还需要考虑到以下几点: 1. **数据...

    Android中获取GSM、CDMA、Wifi信号强度

    "Android中获取GSM、CDMA、Wifi信号强度" Android 中获取 GSM、CDMA、Wifi 信号强度是一个非常重要的功能,特别是在实现某些特定的应用场景时。例如,在某些地区,GSM 信号强度可能会很弱,而 CDMA 信号强度可能会...

    Android手机管家源码.rar

    《深入解析Android手机管家源码》 Android手机管家是一款针对Android平台设计的系统优化与安全管理应用,它集合了清理垃圾、内存加速、病毒查杀、电池管理等多种功能,旨在为用户提供一个安全、高效的手机环境。...

    android 统计上网流量相关资料

    利用Android平台对GPRS流量信息进行统计研究,为用户提供了便利,并且具有广阔的前景。 3. Android平台上的GPRS流量统计系统设计: 文章中提到的GPRS流量统计系统是一个可以实时显示流量信息、导入与导出历史数据的...

    Android~流量统计参考

    1. 获取权限:首先,我们需要在AndroidManifest.xml文件中声明访问网络状态和读取手机状态的权限: ```xml &lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt; &lt;uses-permission android:...

    android 手机卫士文档

    文档《android手机卫士文档》详细介绍了开发过程中的一些关键环节和代码实现。以下是对该文档中提到知识点的详细解读: 1. 软件管家模块概述:软件管家模块是手机卫士应用中的重要组成部分,它负责管理和维护手机中...

    android 网络流量监控源码

    首先感谢原作者,我也是从网上下载代码片段,然后写了个demo,界面上可以直观的看到网络的流量监控。 1.文件为源码,解压后...2.可以直接用在项目里,根据需要获取其他的网络流量信息。 再次感谢原作者!支持开源!

    基于Android平台手机资费流量统计系统设计.pdf

    1. **实时监控**:系统需要实时跟踪和记录用户的手机流量使用情况,包括2G、3G、4G和WiFi等不同网络环境下的数据。 2. **统计分析**:对流量数据进行统计,展示每日、每周和每月的使用量,以便用户了解自己的消费...

Global site tag (gtag.js) - Google Analytics