获取android文件系统的信息,需要Environment类和StatFs类的支持。

(1)Environment 是一个提供访问环境变量的类,常用的方法有:

     

     

      C,getExternalStorageDirectory() ,返回File ,获取外部存储目录即SDCard。
      

      E,getDownloadCacheDirectory(),返回File ,获取Android 下载/缓存内容目录。

常用的字串变量,以getExternalStorageState返回值为例:

      A,MEDIA_BAD_REMOVAL,表明SDCard 被卸载前己被移除。
       B,MEDIA_CHECKING,表明对象正在磁盘检查。
      

     

     

     

      G,MEDIA_SHARED,表明存储媒体正在通过USB共享。
      

      I, MEDIA_UNMOUNTED,表明存储媒体没有挂载。

(2)StatFs类,一个模拟linux的df命令的类,成员函数是获得底层Linux文件系统的属性函数。StatFs 常用方法:

     

     

     

      D,getFreeBlocks(),返回Int ,该块区域剩余的空间(包括可用空间和保留空间)。
(3)一个获取系统和SD卡可用容量及总总量的实例,如下:




1. importandroid.os.Environment;  
2. importandroid.os.StatFs;  
3. importjava.io.File;  
4. publiclonggetAvailableInternalMemorySize(){  
5.        File path = Environment.getDataDirectory();    
6.        StatFs stat = newStatFs(path.getPath());  
7.        longblockSize = stat.getBlockSize();  
8.        longavailableBlocks = stat.getAvailableBlocks();  
9.        returnavailableBlocks*blockSize;  
10. }  
11.      
12. publiclonggetTotalInternalMemorySize(){  
13.        File path = Environment.getDataDirectory();  
14.        StatFs stat = newStatFs(path.getPath());  
15.        longblockSize = stat.getBlockSize();  
16.        longtotalBlocks = stat.getBlockCount();  
17.        returntotalBlocks*blockSize;  
18. }  
19.      
20. publicbooleanexternalMemoryAvailable(){  
21.        returnEnvironment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);  
22. }  
23.      
24. publiclonggetAvailableExternalMemorySize(){  
25.        if(externalMemoryAvailable()){  
26.            File path = Environment.getExternalStorageDirectory();  
27.            StatFs stat = newStatFs(path.getPath());  
28.            longblockSize = stat.getBlockSize();  
29.            longavailableBlocks = stat.getAvailableBlocks();  
30.            returnavailableBlocks*blockSize;  
31.        }  
32.        else{  
33.            return-1;  
34.        }  
35. }  
36.      
37. publiclonggetTotalExternalMemorySize(){  
38.        if(externalMemoryAvailable()){  
39.            File path = Environment.getExternalStorageDirectory();  
40.            StatFs stat = newStatFs(path.getPath());  
41.            longblockSize = stat.getBlockSize();  
42.            longtotalBlocks = stat.getBlockCount();  
43.            returntotalBlocks*blockSize;  
44.        }  
45.        else{  
46.            return-1;  
47.        }  
48. }


     



1.  Log.i("zhangcheng","内部可用存储空间是:"+Long.toString(getAvailableInternalMemorySize()/(1024*1024)));  
2. Log.i("zhangcheng","内部总共存储空间是:"+Long.toString(getTotalInternalMemorySize()/(1024*1024)));  
3.  
4. Log.i("zhangcheng","外部可用存储空间是:"+Long.toString(getAvailableExternalMemorySize()/(1024*1024)));  
5. Log.i("zhangcheng","外部总共存储空间是:"+Long.toString(getTotalExternalMemorySize()/(1024*1024)));

(4)需要注意的是,访问存储器文件系统,也需要在XML中添加权限,如下:



1. <</SPAN>uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
2. <</SPAN>uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 
3. <</SPAN>uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>

==========================================================================================================

     有些应用能安装到SD卡上,有些不能,这其中有一定规则。如何判断?

     Google 默认 PackageManager 管理安装包的机制如下:在 AdroidManifest.xml 里面定义安装位置可以有四种情况:
1. 如果没有定义安装位置,表示安装在手机内存上;
2. android:installLocation = "auto",表示先查看手机内存是否足够,如果够就安装在手机内存上,不够就安装在 T 卡上;
3. android:installLocation = "internalOnly",表示安装在手机内存上;
4. android:installLocation = "preferExternal" ,表示安装在 T 卡上;

      如果 apk 的 AndroidManifest.xml 里面定义 android:installLocation = "internalOnly",那么无论用户选择安装在什么地方,该apk 都会安装到手机上,这样做的好处是避免程序运行错误,因为定义android:installLocation = "internalOnly" 的 apk 一般要安装到手机内存上才能正常运行。