读取android手机流量信息

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

你可能感兴趣的:(android)