本文来自 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 { 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 { 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 { 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*/ } }