偶然间,想到现在手机内存越来越大,外置的sdcard许多人都已经不用了,想具体看下安卓系统对获取sdcard以及机身内存的方法!以下为具体代码:
注意 :印象中记得,普通人们常叫的内存卡(sdcard),就是那个小黑卡,其实在安卓定义中:定义为外置的内存卡;而手机自带的内存被称为:sdcard;
下为具体代码:
根据传入的:is_removale的值不同,从而获得内置内存卡和外置内存卡
/**
* @param is_removale true 外置
* false 内置
* 获取外置/内置内存卡的地址
*/
public static String getStoragePath(Context mContext, boolean is_removale) {
StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
Class<?> storageVolumeClazz = null;
try {
storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
Method getPath = storageVolumeClazz.getMethod("getPath");
Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
Object result = getVolumeList.invoke(mStorageManager);
final int length = Array.getLength(result);
Log.d("sss","---length--"+length);
for (int i = 0; i < length; i++) {
Object storageVolumeElement = Array.get(result, i);
Log.d("sss","---Object--"+storageVolumeElement+"i=="+i);
String path = (String) getPath.invoke(storageVolumeElement);
Log.d("sss","---path_total--"+path);
boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
if (is_removale == removable) {
Log.d("sss","---path--"+path);
return path;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
根据获取到的具体的内存卡,获取其大小,可用空间,存储单元的大小;
/**
* @param is_removale true 外置
* false 内置
* <p>
* <p>
* 获取剩余内存
*/
public String readSDCard(Context mcontext,Boolean is_removale) {
DecimalFormat df = new DecimalFormat("0.00");
if (getStoragePath(mcontext, is_removale) != null) {
StatFs sf = new StatFs(getStoragePath(mcontext, is_removale));
long blockSize;
long blockCount;
long availCount;
if (Build.VERSION.SDK_INT > 18) {
blockSize = sf.getBlockSizeLong(); //文件存储时每一个存储块的大小为4KB
blockCount = sf.getBlockCountLong();//存储区域的存储块的总个数
availCount = sf.getAvailableBlocksLong();//存储区域中可用的存储块的个数(剩余的存储大小)
} else {
blockSize = sf.getBlockSize();
blockCount = sf.getBlockCount();
availCount = sf.getAvailableBlocks();
}
Log.d("sss","总的存储空间大小:" + blockSize*blockCount/1073741824+"GB" + ",剩余空间:" + availCount * blockSize / 1073741824 + "GB"
+"--存储块的总个数--"+blockCount+"--一个存储块的大小--"+blockSize/1024+"KB");
return df.format((double) availCount * (double) blockSize / 1073741824);
}
return "-1";
}
其中:
blockSize = sf.getBlockSizeLong(); //文件存储时每一个存储块的大小为4KB
这句中blockSize,个人水平有限,查阅源码注释,然后百度翻译了一下,认为(存储卡中被分为大小统一的存储单元,进行存储数据,而这个存储单元的大小为4096B,也就是4kb);
这样就完全解释通了,计算总的存储大小和剩余的存储大小,以及和手机机身内存和外置Sdcard大小比较,是完全相同的!
但是,自己在网上查阅资料时,看到了许多人写的获取内存卡的方法:
其中我们看这一条:
获取sdcard的大小:
public void getTotalSdcardSize(){
File sdcardDir = Environment.getExternalStorageDirectory();
Log.d("sss","---mypath--sdcardDir--"+sdcardDir);
StatFs sf = new StatFs(sdcardDir.getPath());
Log.d("sss","---mystatFs--sdcardDir--"+sf);
long blockSize = sf.getBlockSizeLong();
long blockCount = sf.getBlockCountLong();
long availCount = sf.getAvailableBlocksLong();
long total = blockSize*blockCount;
String toal = (total/1024/1024)+"M";
System.out.println("---->"+"--size----"+toal);
System.out.println("----->"+"--剩下size---"+(blockSize*availCount/1024/1024/1024)+"G");
}
其次是获取机身的可用内存:
/**
* 获得机身可用内存
* @return
*/
private long getRomAvailableSize()
{
File path=Environment.getDataDirectory();
Log.d("sss","---mypath----"+path);
StatFs statFs=new StatFs(path.getPath());
Log.d("sss","---mystatFs----"+statFs);
long blockSize=statFs.getBlockSizeLong();
long availableBlocks=statFs.getAvailableBlocksLong();
System.out.println("----->"+"--得机身可用内存---"+(blockSize*availableBlocks/1024/1024/1024)+"G");
return blockSize*availableBlocks;
}
仔细看两种获取 path 的方式:
String state = Environment.getExternalStorageState();
和
File path=Environment.getDataDirectory();
但是这两种获取到的内存大小和剩余内存都是相同的,
07-31 17:15:28.175 1010-1010/com.albb.myzoomimage I/System.out: ----->--获得机身内存大小---25G
07-31 17:15:28.175 1010-1010/com.albb.myzoomimage D/sss: ---mypath----/data
07-31 17:15:28.175 1010-1010/com.albb.myzoomimage D/sss: ---mystatFs----android.os.StatFs@87abb8a
07-31 17:15:28.175 1010-1010/com.albb.myzoomimage I/System.out: ----->--得机身可用内存---9G
很奇怪啊,还有这种操作,后来又百度了一下,看到了下面两篇文章,算是彻底明白了,原来安卓的内存分为三部分:
1,手机自带的内存(其中分为两部分:系统所占内存 + 手机除去系统所占内存剩余的内存,其中“手机除去系统所占内存剩余的内存”被安卓默认为:手机自带sdcard)
2,插入的内存卡(sdcard)
详情请看:
文章链接1:文章一
文章2:文章二
以及参考文章:参考链接