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

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. android 使用html5作布局文件: webview跟javascript交互
  4. Android(安卓)多媒体扫描过程(Android(安卓)Media Scanner Proces
  5. android“设置”里的版本号
  6. Android开发环境搭建
  7. Android(安卓)Resource介绍和使用
  8. 2014.01.21 ——— android 关联android-support源码
  9. 关于Android(安卓)Studio3.2新建项目Android(安卓)resource link

随机推荐

  1. Android(安卓)onTouchEvent, onClick及on
  2. Chronometer android计时器组件Chronomet
  3. android 邮件
  4. Android开发屏幕适配全攻略
  5. ubuntu上Android NDK调试配置
  6. android refbase类
  7. android实现音乐波动条形图
  8. Android如何解析Intent Filter
  9. Android系列之Content Provider
  10. IoT项目:Arduino使用Parse.com的Temboo向A