我正试图找到一种方法来查找手机上安装的SD卡的总大小和可用空间,从我对SOF的研究和Android开发者网站上我能够找到方法getExternalStorageDirectory()但是根据{{3}},这将返回一个不一定是外部的目录:
“传统上这是一张SD卡,但它也可以在与受保护的内部存储不同的设备中实现为内置存储,并且可以作为文件系统安装在计算机上。”
所以我从措辞的方式收集“外部存储”目录实际上可以分开多个物理存储设备(内部和外部存储器)。从我的测试结果来看,我发现使用这种方法返回的大小大约是我实际SD卡大小的1.5倍。
所以我的问题是,是否有一种程序化的方法来返回SD卡上的总大小和可用空间?手机本身可以给我这些信息,所以我觉得应该有办法,但我现在不知所措......任何帮助都将不胜感激!
编辑: 这是我目前用于总大小的代码
private long TotalSDMemory(){
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getAbsolutePath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
long totalSpace = totalBlocks * blockSize;
Log.d(TAG,"Size of total SD Memory: "+totalSpace);
Log.d(TAG, "External storage emulated: "+Environment.isExternalStorageEmulated());
return totalSpace;
}
编辑(2): 我不知道这有什么关系,但我有一个三星Galaxy S3,这是我用来测试代码,显然三星的外部存储器有不同的文件结构。这是一个链接,可以帮助其他人获得正确的大小: Android API
答案 0 :(得分:2)
public String[] getSize() throws IOException {
String memory="";
Process p = Runtime.getRuntime().exec("df /mnt/sdcard");
InputStream is =p.getInputStream();
int by=-1;
while((by=is.read())!=-1) {
memory+=new String(new byte[]{(byte)by});
}
for (String df:memory.split("/n")) {
if(df.startsWith("/mnt/sdcard")) {
String[] par = df.split(" ");
List<String> pp=new ArrayList<String>();
for(String pa:par) {
if(!pa.isEmpty()) {
pp.add(pa);
}
}
return pp.toArray(new String[pp.size()]);
}
}
return null;
}
getSize()[0]是/ mnt / sdcard。 getSize()[1]是sd的大小(例子12.0G),使用了getSize()[2],[3]是免费的,[4]是blksize
或者:
new File("/sdcard/").getFreeSpace() - bytes of free in long
new File("/sdcard/").getTotalSpace() - size of sd
答案 1 :(得分:0)
是的,有办法。
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long sdAvailSize = (long)stat.getAvailableBlocks()
* (long)stat.getBlockSize();
//One binary gigabyte equals 1,073,741,824 bytes.
long gigaAvailable = sdAvailSize / 1073741824;
从这里得到:How can I check how much free space an SD card mounted on an Android device has?
关于获取总尺寸的问题,请点击此处:Getting all the total and available space on Android
<强> 编辑: 强>
Marcelo Filho已指出此方法在API 18(KitKat)中已弃用。
Google建议改为使用getAvailableBlocksLong ()
和getBlockCountLong ()
。两种方法都会返回长值,不返回双倍。
<强> 提示: 强>
Kikiwa已经指出数据类型 long 应该与这些现在已弃用的方法一起使用,否则如果filesize太大,你可能会得到负值。