android获取内部外部存储空间

Environment.getDataDirectory() = /data
Environment.getDownloadCacheDirectory() = /cache
Environment.getExternalStorageDirectory() = /mnt/sdcard
Environment.getRootDirectory() = /system
context.getCacheDir() = /data/data/com.mt.mtpp/cache
context.getExternalCacheDir() = /mnt/sdcard/Android/data/com.mt.mtpp/cache
context.getFilesDir() = /data/data/com.mt.mtpp/files

android系统自从升级到2.3以后,多一个功能,可以判断存储卡是否是可以卸载的。Environment.isExternalStorageRemovable(),通过此方法我们可以知道手机上的存储卡是手机自带的还是外边可插拔的SD卡,当然此种情况是指只有一个卡的情况。
但是现在国内的大多数手机都支持双存储卡:
1、即手机内置的有2G、4G或8G的内部存储卡,默认安装的应用与数据都会到这个卡中,用户不买可插拔的SD卡,也可使用。
2、手机的存储空间毕竟有限,所以手机也支持外置的SD卡,或者叫TF卡、扩展卡等。
那么这时候问题就来了,在程序中我们如何可以判断哪个路径对应的是内置存储卡,哪个对应的是外置存储卡。有人说用Environment.getExternalStorageDirectory()方法得到不就是SD卡吗,这种方法明显不适用的,尤其在4.0以后。
恰恰相反,使用上面的方法得到的大多数是手机内部对应的SD卡(/mnt/sdcard 4.1系统以下,4.1直接变为/storage/sdcard0),下面我总结了一些较常见的外部SD卡的路径:
/mnt/sdcard2                 /mnt/sdcard-ext     /mnt/ext_sdcard    /mnt/sdcard/SD_CARD
/mnt/sdcard/extra_sd   /mnt/extrasd_bind   /mnt/sdcard/ext_sd
/mnt/sdcard/external_SD    /storage/sdcard1   /storage/extSdCard 
如何直接取,而不是hardcode来定死呢,用这个方法getVolumePaths,通过反射机制得到路径,然后判断即可。

代码如下:

package com.example.secsdcard;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.app.Activity;
import android.os.storage.StorageManager;

public class StorageList {

private Activity mActivity;
private StorageManager mStorageManager;
private Method mMethodGetPaths;

public StorageList(Activity activity) {
mActivity = activity;
if (mActivity != null) {
mStorageManager = (StorageManager)mActivity
.getSystemService(Activity.STORAGE_SERVICE);
try {
mMethodGetPaths = mStorageManager.getClass()
.getMethod("getVolumePaths");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}

public String[] getVolumePaths() {
String[] paths = null;
try {
paths = (String[]) mMethodGetPaths.invoke(mStorageManager);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return paths;
}
}

然后Activity通过调用

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
list = new StorageList(this);
TextView textView = new TextView(this);

if (list.getVolumePaths()[0].equals(Environment.MEDIA_MOUNTED)) {
textView.setText("有外部存储卡"+list.getVolumePaths()[0]);
} else {
textView.setText("有外部存储卡"+list.getVolumePaths()[1]);
}

// textView.setText(list.getVolumePaths()[0].toString()+list.getVolumePaths()[1].toString());
textView.setTextSize(50);
setContentView(textView);

}

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();  
          
    }  

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) 
    解释:执行一个由该对象所引用的文件系统 


你可能感兴趣的:(Android,android,SD,存储,缓存)