`
aking86
  • 浏览: 82993 次
  • 性别: 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应用的网络流量,包括获取流量统计、设置流量限制和提醒等功能。通过深入研究这些源码,开发者不仅可以学习到如何在...

    Android手机流量观测客户端

    在Android平台上,开发一款手机流量观测客户端涉及到多个...综上所述,开发一个Android手机流量观测客户端是一个涉及多方面技术的综合工程,需要对Android系统有深入理解,同时具备良好的用户界面设计和数据处理能力。

    android开发手机流量监控

    2. **获取流量信息**:在BroadcastReceiver的onReceive()方法中,调用TrafficStats的统计方法,获取当前的流量数据。 3. **数据计算与展示**:将获取到的流量数据转换成可读性强的格式(如MB或GB),并展示在应用的...

    Android App流量统计源码

    在Android系统中,我们可以利用`ConnectivityManager`和`TrafficStats`类来获取网络流量信息。`ConnectivityManager`用于监控网络连接状态,而`TrafficStats`则提供了统计移动网络和WiFi数据流量的方法。通过调用`...

    Android手机流量电量监控程序

    以下是对这个"Android手机流量电量监控程序"源码的详细分析和相关知识点讲解。 首先,我们要了解Android系统架构,它是基于Linux内核的,允许开发者通过Java语言编写应用程序。在Android中,我们可以利用系统的API...

    Android获取指定应用,单独应用的流量统计

    总之,获取Android应用的流量统计需要理解系统底层的工作原理,合理使用权限,正确处理网络状态变化,并适配不同的Android版本。通过以上步骤,你将能够有效地统计指定应用在WiFi和GPRS网络下的数据流量。

    Android获取手机号码

    在讲解如何获取手机号码之前,我们需要理解Android权限系统以及相关的API。 首先,要获取到用户的手机号码,你的应用程序需要在`AndroidManifest.xml`文件中声明`READ_PHONE_STATE`权限: ```xml ...

    Android 应用流量统计 NetworkStatsManage

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

    Android_获取进程的上下行流量

    通过以上步骤,开发者能够准确地获取 Android 设备上特定进程的上下行流量信息。这对于开发需要监控网络使用的应用程序尤其有用。同时,了解这些 API 的限制和适用范围也是十分重要的,因为并非所有的设备都能够提供...

    移动android手机查话费流量

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

    Android项目实战--手机卫士34--流量管理

    在Android平台上,开发一款手机卫士应用涉及到许多技术点,特别是流量管理功能是现代移动设备用户非常关注的一个特性。在“Android项目实战--手机卫士34--流量管理”中,我们将深入探讨如何构建这样的功能,帮助用户...

    基于Android平台的手机流量实时监控技术的研究与实现.pdf

    然后,文中讨论了当前Android手机流量监控功能的不足之处,提出了基于Android平台的手机流量实时监控技术的研究目标。 在技术实现方面,本文提出了一个基于Android平台的手机流量实时监控技术架构,该架构通过调用 ...

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

    应用根据用户的选择从存储的数据中读取相应的流量信息,然后计算出这段时间内的总上传和下载流量。这些数据显示在界面上,以便用户了解自己的流量使用情况。 在实际开发中,我们还需要考虑到以下几点: 1. **数据...

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

    "Android中获取GSM、CDMA、Wifi信号强度" Android 中获取 GSM、CDMA、Wifi 信号强度是一个非常重要的功能,特别是在实现某些特定的应用场景时。例如,在某些地区,GSM 信号强度可能会很弱,而 CDMA 信号强度可能会...

    Android手机管家源码.rar

    《深入解析Android手机管家源码》 Android手机管家是一款针对Android平台设计的系统优化与安全管理应用,它集合了清理垃圾、内存加速、病毒查杀、电池管理等多种功能,旨在为用户提供一个安全、高效的手机环境。...

    android 统计上网流量相关资料

    利用Android平台对GPRS流量信息进行统计研究,为用户提供了便利,并且具有广阔的前景。 3. Android平台上的GPRS流量统计系统设计: 文章中提到的GPRS流量统计系统是一个可以实时显示流量信息、导入与导出历史数据的...

    Android~流量统计参考

    1. 获取权限:首先,我们需要在AndroidManifest.xml文件中声明访问网络状态和读取手机状态的权限: ```xml &lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt; &lt;uses-permission android:...

    android 手机卫士文档

    文档《android手机卫士文档》详细介绍了开发过程中的一些关键环节和代码实现。以下是对该文档中提到知识点的详细解读: 1. 软件管家模块概述:软件管家模块是手机卫士应用中的重要组成部分,它负责管理和维护手机中...

    android 网络流量监控源码

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

    基于Android平台手机资费流量统计系统设计.pdf

    1. **实时监控**:系统需要实时跟踪和记录用户的手机流量使用情况,包括2G、3G、4G和WiFi等不同网络环境下的数据。 2. **统计分析**:对流量数据进行统计,展示每日、每周和每月的使用量,以便用户了解自己的消费...

Global site tag (gtag.js) - Google Analytics