参考: http://www.2cto.com/kf/201109/102970.html

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

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

写道 C:\>adb shell cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 2268 34 0 0 0 0 0 0 2268 34 0 0 0 0 0 0
eth0: 1556548 19773 0 0 0 0 0 0 2620154 17233 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

C:\>

我们要获取流量可以通过这个文件进行读取
读取的源代码如下

代码 写道 package com.aking86.test;

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) {
objHandler.postDelayed(mTasks, 0);
super.onStart(intent, startId);
}

@Override
public void onCreate() {
super.onCreate();
}

@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onDestroy() {
/* */
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*/

}

}

更多相关文章

  1. android linux 最全的基础知识总结
  2. 利用第三方jar包jaudiotagger实现与MediaMetadataRetriever类似
  3. Android(安卓)控件之Gallery图片集
  4. Android(安卓)SharedPreferences 实现原理
  5. Android(安卓)tips2
  6. Android下用Media Player实现一个最简单的视频播放器
  7. android singleTask几个注意点
  8. Android(安卓)源码中编译Android(安卓)studio工程
  9. NPM 和webpack 的基础使用

随机推荐

  1. 如何在 Mac 上的“照片”中将色阶调整应
  2. 灵魂拷问:为什么做自动化测试的效率总是难
  3. Linux运维入门教程05-01 (正文处理命令及
  4. Hystrix 实战经验分享
  5. 如何使用iMovie对抖动视频进行防抖处理?
  6. centos6.8 update centos7.2
  7. centos6 无法使用yum命令
  8. xxl-job 搭建使用随笔
  9. 浅析liunx负载均衡(apache篇)
  10. flex容器属性的功能,参数,以及作用