`
aking86
  • 浏览: 81769 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

读取android手机流量信息

阅读更多

参考: 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*/

}

}
 

分享到:
评论

相关推荐

    Android_获取进程的上下行流量

    Android_获取进程的上下行流量。

    Android 应用流量统计 NetworkStatsManage

    1.Android官方6.0之后推出的API网络太类 NetworkStatsManager 介绍 2.统计查询方法(UID单个应用,所有应用) 3.统计过程中的发现的坑以及解决方案 4.博客:北极的松树

    移动android手机查话费流量

    移动通信卡的android手机查话费,流量,短信。

    Android中获取GSM、CDMA、Wifi信号强度

    Android中获取GSM、CDMA、Wifi信号强度。 Android中获取GSM、CDMA、Wifi信号强度

    android 网络流量监控源码

    首先感谢原作者,我也是从网上下载代码片段,然后写了个demo,界面上可以直观的看到网络的流量监控。 1.文件为源码,解压后...2.可以直接用在项目里,根据需要获取其他的网络流量信息。 再次感谢原作者!支持开源!

    android手机安全卫士

    显示出每个程序wifi和3g/2g 访问的上传和下载的流量,帮助用户了解程序产生的流量信息. 漫游管理. 当检查到手机处于漫游状态时会提示用户。 手机杀毒:从服务器下载最新的病毒库, 根据程序的包名和程序的数字签名识别...

    Android应用源码可以按时间段查询的流量统计项目

    Android应用源码可以按时间段查询的流量统计项目

    二手商城手机客户端 for android

    二手商城手机客户端是一款基于android,iphone、ipod touch平台的网络购物软件,不仅具有下单、查询订单、搜索商品、产品评价等常用功能,订单提醒等特色功能。 而且还可以在线支付,选择货到付款,产品分享等诸多...

    Android上传(流量、速度)监测与进度条按钮

    可监听当前app的上传流量(下载流量的相关数据里面有获取的方法,可自行实现),获取实时的上传进度与速度,代码封装完整,调用简单,无外在关联。 2.进度条按钮: 既是按钮又是进度条,点击开始上传的时候,可以调用...

    android 通讯录+流量控制+声音控制

    这是demo是android 通讯录,获取联系人的头像,姓名,手机号码,添加联系人;以及修改手机的声音;手机的实时流量

    解析android 流量监测的实现原理

    Android 2.2 版本以前的系统的流量信息都存放在 proc/net/dev(或者 proc/self/net/dev)文件下,读取文件然后对其进行解析就行了。读取某一个应用的流量,则读取proc/uid_stat/uid /tcp_rcv 文件进行解析(注:...

    PCAPdroid:捕获Android设备流量并以PCAP格式导出。 无需root权限

    k -i - 特征: 无需root即可捕获应用流量借助集成的HTTP服务器,轻松下载PCAP文件将UDP上的PCAP流式传输到远程接收器显示捕获的流量实时统计信息应用过滤器以仅捕获所选应用程序的流量获取活动的连接详细信息,包括...

    android reverse tethering2.3

    电脑没有无线网卡,家里没有无线路由器,公司没有wifi网络时却又想让手机不耗流量上网,畅玩手机网游怎么办?Android Reverse Tethering是个不错的选择!轻松通过一条USB线帮助手机上网! 首先请注意:* C9 f6 d$ R...

    基于安卓Android的短信、通话、流量管理小助手

    这是一个手机端的APP,作用是对手机中的短信、通话和流量的使用进行分析,然后绘制柱状图,从柱状图上可以分析出哪个时段的短信数量、通话数量、通话时间,通话频数、流量使用情况等综合分析,然后给你个人的情况给...

    新版Android开发教程.rar

    Android Android Android Android 手机新概念 操作系统的选择 -------- 定制和长尾 � 重构 � MVC 和 Web APP 架构 Android Android Android Android 开发背景 � 计算技术、无线接入技术的发展,使嵌入式系统逐渐...

    android实例之 流量监控悬浮窗 实时网速的获取

    网上那个有bug,这个是我修改的。喜欢的可以下

    安卓手机usb连接电脑上网(android reverse tethering 3.7)

    电脑没有无线网卡,家里没有无线路由器,公司没有wifi网络时却又想让手机不耗流量上网,畅玩手机网游怎么办?Android Reverse Tethering是个不错的选择!轻松通过一条USB线帮助手机上网! 首先请注意:* C9 f6 d$ R...

    Android应用源码 - 基于安卓的个人隐私监控项目

    另外为了保护隐私项目监控了发送短信、读取联系人数据、读取通话记录、获取您当前位置、获得IMEI号码、获得ROOT权限、监听来电状态、读取短消息内容等8项敏感权限的监控并且记录在本地SQLite数据库中,项目需要ROOT...

    Android代码-图片缓存的一种方法

    在移动应用中,我们一般将网络图片分为三个级别,第一级别是网络层,即根据图片的url地址可以找到服务器上相应图片,获取这一层的图片会消耗流量,所以我们希望可以获取后本地就永久使用,所以就会有接下来的缓存...

Global site tag (gtag.js) - Google Analytics