读取android手机流量信息

来源:互联网 发布:炉石传说网络连接超时 编辑:程序博客网 时间:2024/04/28 14:15

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*/

 

 

 

  }

 

 

}

 

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

 

原创粉丝点击