android手机上的那些事

sd文件的操作和获取SD卡剩于流量和总容量

1.显示所有txt文件 
FileFilter filter = new FileFilter() { 
public boolean accept (File file) { 
if (file.isFile() && file.getAbsolutePath().toLowerCase().endsWith(".txt")) { 
return true; 

return false; 

}; 
File[] files = file.listFiles(filter); 
2.创建新文件 
(1) 
File file = new File("/sdcard/a.txt"); 
if (!file.exists()) { 
try { 
file.createNewFile(); 
} catch (IOException e) { 
e.printStackTrace(); 
} } 
(2) 
File file = new File("/sdcard/a/b/c"); 
if (!file.exists()) { 
try { 
file.mkdirs(); 

3.给sd卡中文件写内容 
FileOutputStream fos = new FileOutputStream("/sdcard/a.txt"); 
fos.write("Hello World!".getBytes()); 
fos.flush(); 
如果不想把原来内容覆盖掉 
FileOutputStream fos = new FileOutputStream("/sdcard/a.txt", true); 
4.1、讲述 Environment 类 

Environment 是一个提供访问环境变量的类。 

Environment 包含常量: 

MEDIA_BAD_REMOVAL 
解释:返回getExternalStorageState() ,表明SDCard 被卸载前己被移除 
MEDIA_CHECKING 
解释:返回getExternalStorageState() ,表明对象正在磁盘检查。 
MEDIA_MOUNTED 
解释:返回getExternalStorageState() ,表明对象是否存在并具有读/写权限 
MEDIA_MOUNTED_READ_ONLY 
解释:返回getExternalStorageState() ,表明对象权限为只读 
MEDIA_NOFS 
解释:返回getExternalStorageState() ,表明对象为空白或正在使用不受支持的文件系统。 
MEDIA_REMOVED 
解释:返回getExternalStorageState() ,如果不存在 SDCard 返回 
MEDIA_SHARED 
解释:返回getExternalStorageState() ,如果 SDCard 未安装 ,并通过 USB 大容量存储共享 返回 
MEDIA_UNMOUNTABLE 
解释:返回getExternalStorageState() ,返回 SDCard 不可被安装 如果 SDCard 是存在但不可以被安装 
MEDIA_UNMOUNTED 
解释:返回getExternalStorageState() ,返回 SDCard 已卸掉如果 SDCard  是存在但是没有被安装 
Environment 常用方法: 

方法:getDataDirectory() 
解释:返回 File ,获取 Android 数据目录。 
方法:getDownloadCacheDirectory() 
解释:返回 File ,获取 Android 下载/缓存内容目录。 
方法:getExternalStorageDirectory() 
解释:返回 File ,获取外部存储目录即 SDCard 
方法:getExternalStoragePublicDirectory(String type) 
解释:返回 File ,取一个高端的公用的外部存储器目录来摆放某些类型的文件 
方法:getExternalStorageState() 
解释:返回 File ,获取外部存储设备的当前状态 
方法:getRootDirectory() 
解释:返回 File ,获取 Android 的根目录 
4.2、讲述 StatFs 类 

StatFs 一个模拟linux的df命令的一个类,获得SD卡和手机内存的使用情况 
StatFs 常用方法: 

getAvailableBlocks() 
解释:返回 Int ,获取当前可用的存储空间 
getBlockCount() 
解释:返回 Int ,获取该区域可用的文件系统数 
getBlockSize() 
解释:返回 Int ,大小,以字节为单位,一个文件系统 
getFreeBlocks() 
解释:返回 Int ,该块区域剩余的空间 
restat(String path) 
解释:执行一个由该对象所引用的文件系统 
4.3、完整例子读取 SDCard 内存 

存储卡在 Android 手机上是可以随时插拔的,每次的动作都对引起操作系统进行 ACTION_BROADCAST,本例子将使用上面学到的方法,计算出 SDCard 的剩余容量和总容量。代码如下: 

view plaincopy to clipboardprint? 
package com.terry;   
import java.io.File;   
import java.text.DecimalFormat;   
import android.R.integer;   
import android.app.Activity;   
import android.os.Bundle;   
import android.os.Environment;   
import android.os.StatFs;   
import android.view.View;   
import android.view.View.OnClickListener;   
import android.widget.Button;   
import android.widget.ProgressBar;   
import android.widget.TextView;   
import android.widget.Toast;   
public class getStorageActivity extends Activity {   
    private Button myButton;   
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);    
        findView();   
        viewHolder.myButton.setOnClickListener(new OnClickListener() {   
               
            @Override  
            public void onClick(View arg0) {   
                // TODO Auto-generated method stub   
                getSize();   
            }   
        });   
    }   
       
       
    void findView(){   
        viewHolder.myButton=(Button)findViewById(R.id.Button01);   
        viewHolder.myBar=(ProgressBar)findViewById(R.id.myProgressBar);   
        viewHolder.myTextView=(TextView)findViewById(R.id.myTextView);   
    }   
       
       
       
    void getSize(){   
        viewHolder.myTextView.setText("");   
        viewHolder.myBar.setProgress(0);   
        //判断是否有插入存储卡   
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){   
            File path =Environment.getExternalStorageDirectory();   
            //取得sdcard文件路径   
            StatFs statfs=new StatFs(path.getPath());   
            //获取block的SIZE   
            long blocSize=statfs.getBlockSize();   
            //获取BLOCK数量   
            long totalBlocks=statfs.getBlockCount();   
            //己使用的Block的数量   
            long availaBlock=statfs.getAvailableBlocks();   
               
            String[] total=filesize(totalBlocks*blocSize);   
            String[] availale=filesize(availaBlock*blocSize);   
            //设置进度条的最大值    
            int maxValue=Integer.parseInt(availale[0])   
            *viewHolder.myBar.getMax()/Integer.parseInt(total[0]);   
            viewHolder.myBar.setProgress(maxValue);   
            String Text="总共:"+total[0]+total[1]+"\n"  
            +"可用:"+availale[0]+availale[1];    
            viewHolder.myTextView.setText(Text);   
               
        }else if(Environment.getExternalStorageState().equals(Environment.MEDIA_REMOVED)){   
            Toast.makeText(getStorageActivity.this, "没有sdCard", 1000).show();   
        }   
    }   
       
    //返回数组,下标1代表大小,下标2代表单位 KB/MB   
    String[] filesize(long size){   
        String str="";   
        if(size>=1024){   
            str="KB";   
            size/=1024;   
            if(size>=1024){   
                str="MB";   
                size/=1024;   
            }   
        }   
        DecimalFormat formatter=new DecimalFormat();   
        formatter.setGroupingSize(3);   
        String result[] =new String[2];   
        result[0]=formatter.format(size);   
        result[1]=str;   
        return result;   
    }   
}  


android获取3G或wifi流量信息

Java代码

  1. IBatteryStats battryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService("batteryinfo"));
  2.             byte[] data = null;
  3.                 try {
  4.                         data = battryStats.getStatistics();
  5.                         Parcel parcel = Parcel.obtain();
  6.                         parcel.unmarshall(data, 0, data.length);
  7.                         parcel.setDataPosition(0);
  8.                         final BatteryStatsImpl impl = BatteryStatsImpl.CREATOR.createFromParcel(parcel);
  9.                         try {
  10.                                 Thread.sleep(1000);
  11.                         } catch (InterruptedException e) {
  12.                                 e.printStackTrace();
  13.                         }
  14.                         long length1_1 = impl.getTotalTcpBytesReceived(BatteryStats.STATS_CURRENT);
  15.                         long length1_2 = impl.getTotalTcpBytesReceived(BatteryStats.STATS_LAST);
  16.                         long length1_3 = impl.getTotalTcpBytesReceived(BatteryStats.STATS_TOTAL);
  17.                         long length1_4 = impl.getTotalTcpBytesReceived(BatteryStats.STATS_UNPLUGGED);
  18.                         
  19.                         long length2_1 = impl.getTotalTcpBytesSent(BatteryStats.STATS_CURRENT);
  20.                         long length2_2 = impl.getTotalTcpBytesSent(BatteryStats.STATS_LAST);
  21.                         long length2_3 = impl.getTotalTcpBytesSent(BatteryStats.STATS_TOTAL);
  22.                         long length2_4 = impl.getTotalTcpBytesSent(BatteryStats.STATS_UNPLUGGED);
  23.                         
  24.                         long length3_1 = impl.getMobileTcpBytesReceived(BatteryStats.STATS_CURRENT);
  25.                         long length3_2 = impl.getMobileTcpBytesReceived(BatteryStats.STATS_LAST);
  26.                         long length3_3 = impl.getMobileTcpBytesReceived(BatteryStats.STATS_TOTAL);
  27.                         long length3_4 = impl.getMobileTcpBytesReceived(BatteryStats.STATS_UNPLUGGED);
  28.                         
  29.                         long length4_1 = impl.getMobileTcpBytesSent(BatteryStats.STATS_CURRENT);
  30.                         long length4_2 = impl.getMobileTcpBytesSent(BatteryStats.STATS_LAST);
  31.                         long length4_3 = impl.getMobileTcpBytesSent(BatteryStats.STATS_TOTAL);
  32.                         long length4_4 = impl.getMobileTcpBytesSent(BatteryStats.STATS_UNPLUGGED);
  33.                         
  34.                         Log.d("TAG", "total tcp R dataC:" + length1_1/(1024*1024));
  35.                         Log.d("TAG", "total tcp R dataL:" + length1_2/(1024*1024));
  36.                         Log.d("TAG", "total tcp R dataT:" + length1_3/(1024*1024));
  37.                         Log.d("TAG", "total tcp R dataU:" + length1_4/(1024*1024));
  38.                         
  39.                         Log.d("TAG", "total tcp S dataC:" + length2_1/(1024*1024));
  40.                         Log.d("TAG", "total tcp S dataL:" + length2_2/(1024*1024));
  41.                         Log.d("TAG", "total tcp S dataT:" + length2_3/(1024*1024));
  42.                         Log.d("TAG", "total tcp S dataU:" + length2_4/(1024*1024));
  43.                         
  44.                         Log.d("TAG", "M R tcp dataC:" + length3_1/(1024*1024));
  45.                         Log.d("TAG", "M R tcp dataL:" + length3_2/(1024*1024));
  46.                         Log.d("TAG", "M R tcp dataT:" + length3_3/(1024*1024));
  47.                         Log.d("TAG", "M R tcp dataU:" + length3_4/(1024*1024));
  48.                         
  49.                         Log.d("TAG", "M S tcp dataC:" + length4_1/(1024*1024));
  50.                         Log.d("TAG", "M S tcp dataL:" + length4_2/(1024*1024));
  51.                         Log.d("TAG", "M S tcp dataT:" + length4_3/(1024*1024));
  52.                         Log.d("TAG", "M S tcp dataU:" + length4_4/(1024*1024));
  53.                         
  54.                 } catch (RemoteException e) {
  55.                         // TODO Auto-generated catch block
  56.                         e.printStackTrace();
  57.                 }
Android流量统计TrafficStats类的使用

对于Android流量统计来说在2.2版中新加入了TrafficStats类可以轻松获取,其实本身TrafficStats类也是读取Linux提供的文件对象系统类型的文本进行解析。android.net.TrafficStats类中,提供了多种静态方法,可以直接调用获取,返回类型均为 long型,如果返回等于-1代表 UNSUPPORTED 当前设备不支持统计。 
Java代码

  1. static long getMobileRxBytes() //获取通过Mobile连接收到的字节总数,不包含WiFi
  2. static long getMobileRxPackets() //获取Mobile连接收到的数据包总数
  3. static long getMobileTxBytes() //Mobile发送的总字节数
  4. static long getMobileTxPackets() //Mobile发送的总数据包数
  5. static long getTotalRxBytes() //获取总的接受字节数,包含Mobile和WiFi等
  6. static long getTotalRxPackets() //总的接受数据包数,包含Mobile和WiFi等
  7. static long getTotalTxBytes() //总的发送字节数,包含Mobile和WiFi等
  8. static long getTotalTxPackets() //发送的总数据包数,包含Mobile和WiFi等 
  9. static long getUidRxBytes(int uid) //获取某个网络UID的接受字节数
  10. static long getUidTxBytes(int uid) //获取某个网络UID的发送字节数
复制代码
总接受流量TrafficStats.getTotalRxBytes(), 
总发送流量TrafficStats.getTotalTxBytes()); 
不包含WIFI的手机GPRS接收量TrafficStats.getMobileRxBytes()); 
不包含Wifi的手机GPRS发送量TrafficStats.getMobileTxBytes()); 

某一个进程的总接收量TrafficStats.getUidRxBytes(Uid)); 
某一个进程的总发送量TrafficStats.getUidTxBytes(Uid)); 

这些都是从第一次启动程序到最后一次启动的统计量。并不是 这篇文章 里所说的“从本次开机到本次关机的统计量”! 

用法举例,注意这里得到的单位都是"KB" 
Java代码
  1. public long getTotalRxBytes(){ //获取总的接受字节数,包含Mobile和WiFi等
  2. return TrafficStats.getTotalRxBytes()==TrafficStats.UNSUPPORTED?0:(TrafficStats.getTotalRxBytes()/1024);
  3. }
  4. public long getTotalTxBytes(){ //总的发送字节数,包含Mobile和WiFi等
  5. return TrafficStats.getTotalTxBytes()==TrafficStats.UNSUPPORTED?0:(TrafficStats.getTotalTxBytes()/1024);
  6. }
  7. public long getMobileRxBytes(){ //获取通过Mobile连接收到的字节总数,不包含WiFi
  8. return TrafficStats.getMobileRxBytes()==TrafficStats.UNSUPPORTED?0:(TrafficStats.getMobileRxBytes()/1024);
  9. }
复制代码
对于 Android流量统计来说在2.2版中加入了
TrafficStats
类可以轻松获取,其实本身 TrafficStats类也是读取 Linux提供的文件对象系统类型的文本进行解析


android.net.TrafficStats类中
,提供了多种静态方法,可以直接调用获取,返回类型均为long型,如果返回等于-1代表  UNSUPPORTED 当前设备不支持统计。
  1. static long  getMobileRxBytes()  //获取通过Mobile连接收到的字节总数,不包含WiFi
  2. static long  getMobileRxPackets()  //获取Mobile连接收到的数据包总数,不包含WiFi
  3. static long  getMobileTxBytes()  //Mobile发送的总字节数
  4. static long  getMobileTxPackets()  //Mobile发送的总数据包数
  5. static long  getTotalRxBytes()  //获取总的接受字节数,包含Mobile和WiFi等
  6. static long  getTotalRxPackets()  //总的接受数据包数,包含Mobile和WiFi等
  7. static long  getTotalTxBytes()  //总的发送字节数,包含Mobile和WiFi等
  8. static long  getTotalTxPackets()  //发送的总数据包数,包含Mobile和WiFi等
  9. static long  getUidRxBytes(int uid)  //获取某个网络UID的接受字节数
  10. static long  getUidTxBytes(int uid) //获取某个网络UID的发送字节数
复制代码
最后再次提醒,TrafficStats类工作在Android 2.2 API Level为8的固件上。如果想支持android8以下的系统请参考TrafficStats源码

这些数据都是从这次开机开始,到查询的时间的流量,关机之后将被清


如何去设计:

      因为每次开机都不一样,所以要设置一个广播接收器接收开机和关机的广播,决定对流量的
初始化工作和保存工作。当然在每次查看流量的时候也要做一次查询和保存工作,
把统计的数据保存到数据库里


如何设计数据库?

          一个数据表记录:每次查询的值,查询的时间,网络类型,网络流量,是否为关机时保存的标志。

        
每次查询的总流量 = 当次流量 + 所有关机保存的流量,
还可以在程序启动之后开启一个服务,没隔多长时间保存一次。
还有在每天晚上12点(11:59分)的时候做一次保存工作。
还有一次需要注意的是getUidRxBytes(int uid)只能取到所有的数据,包括2g/3g和wifi


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值