本文来自
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<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系统有深入理解,同时具备良好的用户界面设计和数据处理能力。
2. **获取流量信息**:在BroadcastReceiver的onReceive()方法中,调用TrafficStats的统计方法,获取当前的流量数据。 3. **数据计算与展示**:将获取到的流量数据转换成可读性强的格式(如MB或GB),并展示在应用的...
在Android系统中,我们可以利用`ConnectivityManager`和`TrafficStats`类来获取网络流量信息。`ConnectivityManager`用于监控网络连接状态,而`TrafficStats`则提供了统计移动网络和WiFi数据流量的方法。通过调用`...
以下是对这个"Android手机流量电量监控程序"源码的详细分析和相关知识点讲解。 首先,我们要了解Android系统架构,它是基于Linux内核的,允许开发者通过Java语言编写应用程序。在Android中,我们可以利用系统的API...
总之,获取Android应用的流量统计需要理解系统底层的工作原理,合理使用权限,正确处理网络状态变化,并适配不同的Android版本。通过以上步骤,你将能够有效地统计指定应用在WiFi和GPRS网络下的数据流量。
在讲解如何获取手机号码之前,我们需要理解Android权限系统以及相关的API。 首先,要获取到用户的手机号码,你的应用程序需要在`AndroidManifest.xml`文件中声明`READ_PHONE_STATE`权限: ```xml ...
通过以上步骤,开发者能够准确地获取 Android 设备上特定进程的上下行流量信息。这对于开发需要监控网络使用的应用程序尤其有用。同时,了解这些 API 的限制和适用范围也是十分重要的,因为并非所有的设备都能够提供...
1.Android官方6.0之后推出的API网络太类 NetworkStatsManager 介绍 2.统计查询方法(UID单个应用,所有应用) 3.统计过程中的发现的坑以及解决方案 4.博客:北极的松树
移动通信卡的android手机查话费,流量,短信。
在Android平台上,开发一款手机卫士应用涉及到许多技术点,特别是流量管理功能是现代移动设备用户非常关注的一个特性。在“Android项目实战--手机卫士34--流量管理”中,我们将深入探讨如何构建这样的功能,帮助用户...
应用根据用户的选择从存储的数据中读取相应的流量信息,然后计算出这段时间内的总上传和下载流量。这些数据显示在界面上,以便用户了解自己的流量使用情况。 在实际开发中,我们还需要考虑到以下几点: 1. **数据...
"Android中获取GSM、CDMA、Wifi信号强度" Android 中获取 GSM、CDMA、Wifi 信号强度是一个非常重要的功能,特别是在实现某些特定的应用场景时。例如,在某些地区,GSM 信号强度可能会很弱,而 CDMA 信号强度可能会...
《深入解析Android手机管家源码》 Android手机管家是一款针对Android平台设计的系统优化与安全管理应用,它集合了清理垃圾、内存加速、病毒查杀、电池管理等多种功能,旨在为用户提供一个安全、高效的手机环境。...
为应对这一挑战,本文提出了一项基于Android平台的手机流量实时监控技术的研究与实现。 首先,我们回顾Android操作系统的特点和市场占有率,可以发现Android系统以其开放性、定制性和广泛的硬件兼容性,成为了目前...
利用Android平台对GPRS流量信息进行统计研究,为用户提供了便利,并且具有广阔的前景。 3. Android平台上的GPRS流量统计系统设计: 文章中提到的GPRS流量统计系统是一个可以实时显示流量信息、导入与导出历史数据的...
1. 获取权限:首先,我们需要在AndroidManifest.xml文件中声明访问网络状态和读取手机状态的权限: ```xml <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:...
文档《android手机卫士文档》详细介绍了开发过程中的一些关键环节和代码实现。以下是对该文档中提到知识点的详细解读: 1. 软件管家模块概述:软件管家模块是手机卫士应用中的重要组成部分,它负责管理和维护手机中...
首先感谢原作者,我也是从网上下载代码片段,然后写了个demo,界面上可以直观的看到网络的流量监控。 1.文件为源码,解压后...2.可以直接用在项目里,根据需要获取其他的网络流量信息。 再次感谢原作者!支持开源!
1. **实时监控**:系统需要实时跟踪和记录用户的手机流量使用情况,包括2G、3G、4G和WiFi等不同网络环境下的数据。 2. **统计分析**:对流量数据进行统计,展示每日、每周和每月的使用量,以便用户了解自己的消费...