讀取android手機流量信息 – Android移動開發技術文章_手機開發 Android移動開發教學課程

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*/
 
 
 
  }
 
 
}

作者“技術人生”

發佈留言