`
wenjiefeng
  • 浏览: 8500 次
  • 来自: 北京
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
Android获取SdCard路径及剩余容量 sdcard 路径 容量
SD卡路径问题以及如何获取SDCard 内存
 昨天在研究拍照后突破的存储路径的问题,开始存储路径写死为: private String folder = "/sdcard/DCIM/Camera/"(SD卡上拍照程序的图片存储路径); 后来发现这样写虽然一般不会出错,但不是很好,因为不同相机,可能路径会出问题。较好的方法是通过Environment 来获取路径,最后给出一个例子,教你怎样获取SDCard 的内存,显示出来告诉用户。讲述的内容如下: 
 0、获取sd卡路径。
 1、讲述 Environment 类。
 2、讲述 StatFs 类。
 3、完整例子读取 SDCard 内存
 
0、获取sd卡路径 
 方法一: private String folder = "/sdcard/DCIM/Camera/"(SD卡上拍照程序的图片存储路径); //写死绝对路径,不赞成使用 
 
方法二: 
 public String getSDPath(){ 
 File sdDir = null; 
 boolean sdCardExist = Environment.getExternalStorageState() 
 .equals(android.os.Environment.MEDIA_MOUNTED); //判断sd卡是否存在 
 if (sdCardExist) 
 { 
 sdDir = Environment.getExternalStorageDirectory();//获取跟目录 
 } 
 return sdDir.toString(); 
 
} 
 
然后:在后面加上斜杠,在加上文件名 
 String fileName = getSDPath() +"/" + name;//以name存在目录中 
 

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 的根目录
 2、讲述 StatFs 类 
 StatFs 一个模拟linux的df命令的一个类,获得SD卡和手机内存的使用情况 
 StatFs 常用方法: 
 getAvailableBlocks() 
 解释:返回 Int ,获取当前可用的存储空间
 getBlockCount() 
 解释:返回 Int ,获取该区域可用的文件系统数
 getBlockSize() 
 解释:返回 Int ,大小,以字节为单位,一个文件系统
 getFreeBlocks() 
 解释:返回 Int ,该块区域剩余的空间
 restat(String path) 
 解释:执行一个由该对象所引用的文件系统
 
具体代码如下所示:
 
  
 
  public static String getExternalStoragePath() {
 
  // 获取SdCard状态
 
  String state = android.os.Environment.getExternalStorageState();
 
  // 判断SdCard是否存在并且是可用的
 
  if (android.os.Environment.MEDIA_MOUNTED.equals(state)) {
 
  if (android.os.Environment.getExternalStorageDirectory().canWrite()) {
 
         return android.os.Environment.getExternalStorageDirectory().getPath();
 
  }
 
  }
 
  return null;
 
  }
 
  
 
  public static long getAvailableStore(String filePath) {
 
  // 取得sdcard文件路径
 
  StatFs statFs = new StatFs(filePath);
 
  // 获取block的SIZE
 
  long blocSize = statFs.getBlockSize();
 
  // 获取BLOCK数量
 
  // long totalBlocks = statFs.getBlockCount();
 
  // 可使用的Block的数量
 
  long availaBlock = statFs.getAvailableBlocks();
 
  // long total = totalBlocks * blocSize;
 
  long availableSpare = availaBlock * blocSize;
 
  return availableSpare;
 
  }
文件类File的详细使用说明 android
 
 
import java.io.File; 
import java.io.IOException; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Environment; 
 
 
public class FileTestActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
         
        //小马写的时候不带后缀名,其实这个要写的 
        //而且安卓中不建议用此种写法,支持使用Environment获取路径 
        String path = "/sdcard/fileName";  
        File file = new File(path); //不多讲 
         
         
        //下面是File类的一些静态属性 
        //file.separator;    小马以前喜欢用"/",虽然不错,但不支持,接着看下面 
         
         
        //举两种 写法: 
              //方法一: 
              String path2 = Environment.getExternalStorageDirectory()
                             .getPath() 
                             +"/"+"XiaoMa.txt"; 
              File fileName = new File(path2); 
              //此处可以添加对文件的操作,IO流 
               
               
              //方法二: 
              String path3 = Environment.getExternalStorageDirectory()
                             .getPath() 
                             +File.separator+"XiaoMa.txt"; 
              File fileNam = new File(path3); 
              //此处可以添加对文件的操作,IO流 
         
               
              /** 
               * 大家是不是发现这两种写法第二种多此一举?其实并非如此的
               *,在Android中,官方鼓励支持使用 
               * File.separator来插入"/"符号 
               * 因为:不同的机型配置系统等各种因素下,"/"符号的转义字符也会不同*
               *,所以为保险起见, 
               * 建议朋友们使用File.separator来区别 
               */ 
           
               
              //下面讲下文件的创建是怎么一回事 
              //Android 中创建文件的方式有很多种,小马现在讲下
              //我们经常用到的几种哦,吼吼 
              File file3 = new File("path"); //path为要创建文件的路径
              //,相关路径可查看API 
               
               
              //创建一个临时文件 
              //小马讲下,如果让我们自己创建临时文件时,我们还得拼接文件名
              //,Android为我们提供了更快捷的方式 
              //prefix代表:文件名前缀,suffix代表:生成临时文件的格式,
              //如:.txt .amr .jpg .png等等 
              try { 
                 //此处小马未指定路径,它会默认创建在SD卡根目录下 
                File tempFile = File.createTempFile("前缀", "格式"); //记得加入try语句块中 
                 
                //如果想要指定路径,则可以这样写 
                File tempFile2  = File.createTempFile("前缀", "格式",new File("指定临时文件路径")); 
              } catch (IOException e) { 
                e.printStackTrace(); 
              }  
               
               
              //创建文件的方式有三种:要看仔细咯 
                   
                  File file2 = new File(path3);  //因为路径是自己指定的,
                                                  //在此小马就直接合上面定义过的路径了 
                  if(!file2.exists()){ 
                       
                       //方式一: 
                      try { 
                        file2.createNewFile(); 
                       } catch (IOException e) { 
                        // TODO Auto-generated catch block 
                        e.printStackTrace(); 
                       } 
                       
                      //方式二: 
                      //file2.mkdir(); 
                       
                      //方式三: 
                      //file2.mkdirs(); 
                       
                      /** 
                       * 以上创建文件方式好像也没多大不同之处,小马的的错误,
                       *创建文件的时候随便调用这三个方法其中之一 
                       * 但后来发现还是有明显区别的,现在贴一段官方API说明
                       *,小马英语也不咋的,希望英语一般的朋友们 
                       * 看到英语不要怕自己不会翻译什么的,多查单词,
                       *不会的再求助工作翻译下,查可以提高自己的英语能力 
                       */ 
                       
                       
                       
                      /** 
                       * 小述:讲下“/”与“\”的不同,在创建文件时不能使用使用windows方式,
                       *也就是"\",除非你转义有linux方式的话就直接用“/”,省了麻烦,
                       *还不会出错转义错误等问题,对吧? 
                       */ 
                       
                       
                     /** 
                      * createNewFile() 
                        Creates a new, empty file on the file system according to the path information  
                        stored in this file. 
                        这个方法指在指定路径下创建一个empty(空的,小马就认识几个单词,
                        *其余的都有道查)文件  
                      */ 
                       
                    /** 
                     * mkdir() 
                       Creates the directory named by the trailing filename of
                       this file. 
                             这个方法指:创建一个指定目录下的文件,但这个方法不能创建多个目录,
                     一般都使用加S的,这个尽量少用,一般私有文件 
                             及私有目录的创建用这个方法 
                     */ 
                       
                     
                     /** 
                      * mkdirs() 
                        Creates the directory named by the trailing filename of this file,  
                        including the complete directory path required to create this
                         directory. 
                        这个方法指:创建一个指定目录下的文件,与上面不同的是,
                        此方法可以创建多个目录哦,常用的创建文件的方法 
                      */ 
                       
                      /** 
                       * 最后,讲下isDirectory() 与  isFile()的小区别 
                       * 小马刚开始不懂什么是Directory,后来试了下,讲直接的,
                       就是:是否是文件夹,isFile是否是文件,简单吧??O_O 
                       */ 
                       
                       
                       
                     
                       
                  } 
               
    } 
} 
    最后,不要忘记加Android中文件操作的权限:
 
<!--往sdcard中写入数据的权限 --> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
 <!--在sdcard中创建/删除文件的权限 --> 
 
 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission> 
Global site tag (gtag.js) - Google Analytics